Bayesian Statistical Analysis of CO2 Emissions Data

Project tasks (to delete)

  1. Consider a regression model to explain C02 emission with the other variables. You can transform some of the variables.

  2. Additional questions: C02 and GDP are strongly dependent? Historically, CO2 emissions have been strongly correlated with how much money we have. This is particularly true at low-to-middle incomes. The richer we are, the more CO2 we emit. This is because we use more energy – which often comes from burning fossil fuels. This relationship is still true at higher incomes?

  3. In addition you can: consider and compare various years. Consider the time as a covariate. Add more covariates (taking them from the web). Consider time series models.

Introduction

Human emissions of carbon dioxide and other greenhouse gases are a primary driver of climate change and present one of the world’s most pressing challenges.

To understand this complex issue better our analysis will focus on:

  1. Long-Term Trends: we will examine how CO2 emissions have evolved over the past century, identifying key periods of increase or decrease in the speed of emissions and correlating these with historical events.

  2. Recent Factors Influencing CO2 Emissions: we will analyze the impact of various factors on CO2 emissions from 2006 to 2009. This includes investigating the relationship between CO2 emissions and variables such as energy consumption, GDP, and the adoption of low-carbon energy sources.

  3. Comparative Analysis: We will compare findings from both datasets to understand how historical trends relate to more recent developments.

Datasets

Brief description of the datasets:

By integrating these two datasets, we aim to analyse CO2 emissions over time and identify the factors driving changes in recent years.

Dataset 1

We begin our analysis by considering the long-term trends in annual CO2 emissions over the last century.

Sources:

https://ourworldindata.org/grapher/annual-co2-emissions-per-country

Short description:

Human emissions of carbon dioxide and other greenhouse gases between 1900 and 2022.

It includes data for various nations, encompassing the following variables:

# Loading the data
CO2_full <- read.csv("Data/annual-co2-emissions-per-country.csv")
CO2_full$AnnualCO2 = CO2_full$AnnualCO2 /10^9
head(CO2_full)


# We filter the dataset for the world data after 1900
world_data <- CO2_full[CO2_full$country == 'World' & CO2_full$Year > 1900,]

# Plot
plot(world_data$Year, world_data$AnnualCO2, type='l', col='darkgreen', ylab="Annual CO2 (billion t)", main="CO2 Emissions for the World", xlab="Year")
points(world_data$Year, world_data$AnnualCO2, col='darkgreen', pch=16, cex=0.5)

The data presents a clear exponential trend, for this reason it could be interesting to analyse the logarithm of the data and see if we can find some interesting trends.

We will transform the CO2 in log_CO2 and also compute the increment in log_CO2 i.e \[ x_t :=\log(y_{t+1})-\log(y_t) \]

# Creating the data
CO2_log = log(world_data$AnnualCO2, 10)
n1 = length(CO2_log)

delta_logdata = CO2_log[2:n1] - CO2_log[1:n1-1]
n2 = length(delta_logdata)

# Years 
year = world_data$Year


# Plots
# Log data
plot(year, CO2_log, type='l', col='darkgreen', ylab="log(Annual CO2)", main="log(CO2)", xlab="Year")
points(year, CO2_log, col='darkgreen', pch=16, cex=0.5)


# Delta log data
plot(year[1:length(delta_logdata)], delta_logdata, type='l', ylab="Delta log-co2", main="Delta log-co2", xlab="Year")

Change point model for the variance

From the delta log-CO2 it is clear from the data that some kind of shift on the variance is happening.

To analyse this in more detail we will fit a change point model on the variance to our data.

We assume for our data a Gaussian likelihood:\[ y_t \sim \mathcal{N}(\mu_0,\sigma_t^2). \]An event occurs at a random unobserved time \(\tau\), the so-called “change point”.
This is reflected in the assumption \[ \sigma_t^2 =\sigma_{1}^2 \quad t < \tau \] and \[ \sigma_t^2 =\sigma_{2}^2 \quad t \geq \tau \] where \(\sigma_1^2, \sigma_2^2\) are unknown.

The model is as follows: \[ \begin{split} & y_t \sim \mathcal{N}(\mu_0,\sigma_t^2)\\ & \sigma_t^2 = \sigma_{1}^2 \{t < \tau \} + \sigma_2^2 \{ t \geq \tau\} \\ & \tau \sim \mathcal{U}(0,M) \\ & \mu_0 \sim \mathcal{N}(0,100) \\ & \frac{1}{\sigma_i^2} \sim \mathcal{G}(0.001, 0.001) \ &i \in [1, 2] \end{split} \] \(M\) is a parameter that indicates the number of datapoints.

We choose the priors for \(\mu_0\) and \(\frac{1}{\sigma_i^2}\) to be weakly informative.

library(rjags)
library(bayesplot)
library(jagsUI)
library(loo)

# change-point model
modelChangePoint <-
"model{
  # Likelihood
  for(i in 1:n){
    x[i] ~ dnorm(mu, sinv_CP[i])
    sinv_CP[i] <- sinv[J[i]] 
    J[i] <- d[i] + 1         # move to (0,1) in (1,2)

  }
  
  # Mean change
  for(t in 1:n){
    d[t] <- step(Tau - t)   
              # 0 if (agument < 0), 1 otherwise  
              # Probabilities of the changing point to have happened
  }
  
  # Prior for d[i]
  Tau ~ dunif(1, n+10)
  
  # Prior for beta
  mu ~ dnorm(0, 0.01) 
  sinv[1] ~ dgamma(0.001, 0.001)   # Non informative
  sinv[2] ~ dgamma(0.001, 0.001)
  # sinv[1] ~  dunif(0, 100000)   # Non informative
  # sinv[2] ~  dunif(0, 100000)
  
}"



# Data
myData = list(x=delta_logdata, n=length(delta_logdata)) 

# Jags
outputmcmcCP <- jags(model.file=textConnection(modelChangePoint),
                     data = myData,
                     parameters.to.save = c("mu", "sinv_CP", "Tau","J"), 
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 121
   Unobserved stochastic nodes: 4
   Total graph size: 735

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |+                                                 |   2%
  |                                                        
  |++                                                |   4%
  |                                                        
  |+++                                               |   6%
  |                                                        
  |++++                                              |   8%
  |                                                        
  |+++++                                             |  10%
  |                                                        
  |++++++                                            |  12%
  |                                                        
  |+++++++                                           |  14%
  |                                                        
  |++++++++                                          |  16%
  |                                                        
  |+++++++++                                         |  18%
  |                                                        
  |++++++++++                                        |  20%
  |                                                        
  |+++++++++++                                       |  22%
  |                                                        
  |++++++++++++                                      |  24%
  |                                                        
  |+++++++++++++                                     |  26%
  |                                                        
  |++++++++++++++                                    |  28%
  |                                                        
  |+++++++++++++++                                   |  30%
  |                                                        
  |++++++++++++++++                                  |  32%
  |                                                        
  |+++++++++++++++++                                 |  34%
  |                                                        
  |++++++++++++++++++                                |  36%
  |                                                        
  |+++++++++++++++++++                               |  38%
  |                                                        
  |++++++++++++++++++++                              |  40%
  |                                                        
  |+++++++++++++++++++++                             |  42%
  |                                                        
  |++++++++++++++++++++++                            |  44%
  |                                                        
  |+++++++++++++++++++++++                           |  46%
  |                                                        
  |++++++++++++++++++++++++                          |  48%
  |                                                        
  |+++++++++++++++++++++++++                         |  50%
  |                                                        
  |++++++++++++++++++++++++++                        |  52%
  |                                                        
  |+++++++++++++++++++++++++++                       |  54%
  |                                                        
  |++++++++++++++++++++++++++++                      |  56%
  |                                                        
  |+++++++++++++++++++++++++++++                     |  58%
  |                                                        
  |++++++++++++++++++++++++++++++                    |  60%
  |                                                        
  |+++++++++++++++++++++++++++++++                   |  62%
  |                                                        
  |++++++++++++++++++++++++++++++++                  |  64%
  |                                                        
  |+++++++++++++++++++++++++++++++++                 |  66%
  |                                                        
  |++++++++++++++++++++++++++++++++++                |  68%
  |                                                        
  |+++++++++++++++++++++++++++++++++++               |  70%
  |                                                        
  |++++++++++++++++++++++++++++++++++++              |  72%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++             |  74%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++            |  76%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++           |  78%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++          |  80%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++         |  82%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++        |  84%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++       |  86%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++      |  88%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++     |  90%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++    |  92%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++   |  94%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++  |  96%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++++ |  98%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
outputmcmcCP
JAGS output for model '5', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 1,
yielding 36000 total samples from the joint posterior. 
MCMC ran for 0.089 minutes at time 2024-06-04 18:55:29.56004.

**WARNING** Some Rhat values could not be calculated.
**WARNING** Rhat values indicate convergence failure. 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 8 and DIC = -627.93 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(outputmcmcCP$samples[,c("sinv_CP[10]")], main="posterior sinv_CP[10]")

plot(outputmcmcCP$samples[,c("sinv_CP[90]")], main="posterior sinv_CP[90]")

# Autocorrelation function:
autocorr.plot(outputmcmcCP$samples[,c("sinv_CP[10]")], main= "sinv_CP[10] ACF")

autocorr.plot(outputmcmcCP$samples[,c("sinv_CP[90]")], main= "sinv_CP[90] ACF")


# Selecting the taus
tau_samples = outputmcmcCP$samples[[1]][, "Tau"]

# Calculate the mean
tmean <- mean(tau_samples)

# Calculate the 2.5% quantile
q1 <- quantile(tau_samples, probs = 0.05)

# Calculate the 97.5% quantile
q2 <- quantile(tau_samples, probs = 0.95)


# Finding the year corresponding to qi
year_q1 = year[floor(q1)]
year_q2 = year[floor(q2)]
year_tmean = year[floor(tmean)]



# Plot 
plot(year[1:length(delta_logdata)], delta_logdata, type='l', ylab="Delta log-co2", main="Delta log-co2", xlab="Year")

# lines for the change point
abline(v=year_tmean, col="red", lwd=1.5)
abline(v=year_q1, col="red", lwd=1.5, lty = 3)
abline(v=year_q2, col="red", lwd=1.5, lty = 3)




# Create a data frame to print the years
df <- data.frame(
  q1 = year_q1,
  Mean = year_tmean,
  q2 = year_q2
)
colnames(df) <- c("5%", "Mean", "95%")


# Print the data frame
print(df)

Our analysis suggests a potential shift in the variance of the emission around 1951. With 90% confidence, we can say this shift likely occurred between 1949 and 1956. This timeframe is particularly interesting because it coincides with several major events that could be linked to this change in trend:

  • The Marshall Plan (1948): This large-scale U.S. program aimed to rebuild Europe after World War II. It likely spurred economic activity and potentially increased CO2 emissions.

  • The Post-War Economic Boom (1945-1973): This period of rapid economic growth across the globe could have significantly contributed to rising emissions.

One possible interpretation of these findings is that improved economic conditions led to both a decrease in the variability and an increase in the overall quantity of emissions. This suggests a shift towards more consistent, but higher, emissions during this time.

Credible Interval: When you specify a range between the 5th percentile and the 95th percentile of the posterior distribution, you are describing a 90% credible interval. A credible interval gives a range within which the true parameter is believed to lie with a certain probability, according to the posterior distribution.

Change Point model for the mean

Given the potential shift in CO2 emission patterns around 1951, a next step could be to investigate if there are further changes in trend following this period. The Post-War Economic Boom ended with a recession (1973-1975), followed by an even deeper one in the early 1980s. This historical context prompts the question: Can we detect another change point in the CO2 emissions data after 1951?

For the next analysis we will try to fit the data after the first shift (1951) with a change point model on the mean of the delta log-co2 in the years after 1956 (95% quantile of the change point on the variance). This means that we will analyse the change in speed of the increase of CO2 (mean of the logarithm) and not its variance anymore.

The model is as follows:\[ \begin{split} & y_t \stackrel{ind}{\sim} \mathcal{N}(\mu_t,\sigma_{0}^2)\\ & \mu_t=\mu_1 \{t < \tau \} + \mu_2 \{ t \geq \tau\} \\ & \tau \sim \mathcal{U}(0,M) \\ & \mu_1 \sim \mathcal{N}(5,100) \\ & \mu_2 \sim \mathcal{N}(0,100) \\ & \frac{1}{\sigma^2} \sim \mathcal{U}(0, 100000) \end{split} \]\(M\) is a parameter that indicates the number of datapoints.

We choose the priors for \(\mu_0\) and \(\frac{1}{\sigma^2}\) to be weakly informative.

# Filtering for data after the change point
# !!! The data is after 1956 (even if the variable has a 51 in the name)
world_data_after1951 <- world_data[world_data$Year > 1956,]
          

# Creating the data
CO2_log_51 = log(world_data_after1951$AnnualCO2, 10)
n1 = length(CO2_log_51)

delta_logdata_51 = CO2_log_51[2:n1] - CO2_log_51[1:n1-1]
n2 = length(delta_logdata)

# Years 
year = world_data_after1951$Year


# Plots
plot(year, CO2_log_51, type='l', col='darkgreen', ylab="log(Annual CO2)", main="log(CO2)", xlab="Year")
points(year, CO2_log_51, col='darkgreen', pch=16, cex=0.5)


# Delta log data
plot(year[1:length(delta_logdata_51)], delta_logdata_51, type='l', ylab="Delta log-co2", main="Delta log-co2", xlab="Year")

# change-point model
modelChangePoint_mean <-
"model{
  # Likelihood
  for(i in 1:n){
    x[i] ~ dnorm(mu[i], sinv)
    mu[i] <- m[J[i]] 
    J[i] <- d[i] + 1         # move to (0,1) in (1,2)
  }
  
  # Mean change
  for(t in 1:n){
    d[t] <- step(Tau - t)   # probabilities of the changing point to have happened
  }
  
  # Prior for d[i]
  Tau ~ dunif(1, n+10)
  
  # Prior for beta
  m[1] ~ dnorm(5, 0.01)
  m[2] ~ dnorm(0, 0.01)
  sinv ~ dunif(0, 100000)         # This is more stable that a Gamma
  
}"


# Data
myData = list(x=delta_logdata_51, n=length(delta_logdata_51)) 

# Jags
outputmcmcCP <- jags(model.file=textConnection(modelChangePoint_mean),
                     data = myData,
                     parameters.to.save = c("mu", "sinv", "Tau","J"), 
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000, 
                     n.thin = 1)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 65
   Unobserved stochastic nodes: 4
   Total graph size: 399

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |+                                                 |   2%
  |                                                        
  |++                                                |   4%
  |                                                        
  |+++                                               |   6%
  |                                                        
  |++++                                              |   8%
  |                                                        
  |+++++                                             |  10%
  |                                                        
  |++++++                                            |  12%
  |                                                        
  |+++++++                                           |  14%
  |                                                        
  |++++++++                                          |  16%
  |                                                        
  |+++++++++                                         |  18%
  |                                                        
  |++++++++++                                        |  20%
  |                                                        
  |+++++++++++                                       |  22%
  |                                                        
  |++++++++++++                                      |  24%
  |                                                        
  |+++++++++++++                                     |  26%
  |                                                        
  |++++++++++++++                                    |  28%
  |                                                        
  |+++++++++++++++                                   |  30%
  |                                                        
  |++++++++++++++++                                  |  32%
  |                                                        
  |+++++++++++++++++                                 |  34%
  |                                                        
  |++++++++++++++++++                                |  36%
  |                                                        
  |+++++++++++++++++++                               |  38%
  |                                                        
  |++++++++++++++++++++                              |  40%
  |                                                        
  |+++++++++++++++++++++                             |  42%
  |                                                        
  |++++++++++++++++++++++                            |  44%
  |                                                        
  |+++++++++++++++++++++++                           |  46%
  |                                                        
  |++++++++++++++++++++++++                          |  48%
  |                                                        
  |+++++++++++++++++++++++++                         |  50%
  |                                                        
  |++++++++++++++++++++++++++                        |  52%
  |                                                        
  |+++++++++++++++++++++++++++                       |  54%
  |                                                        
  |++++++++++++++++++++++++++++                      |  56%
  |                                                        
  |+++++++++++++++++++++++++++++                     |  58%
  |                                                        
  |++++++++++++++++++++++++++++++                    |  60%
  |                                                        
  |+++++++++++++++++++++++++++++++                   |  62%
  |                                                        
  |++++++++++++++++++++++++++++++++                  |  64%
  |                                                        
  |+++++++++++++++++++++++++++++++++                 |  66%
  |                                                        
  |++++++++++++++++++++++++++++++++++                |  68%
  |                                                        
  |+++++++++++++++++++++++++++++++++++               |  70%
  |                                                        
  |++++++++++++++++++++++++++++++++++++              |  72%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++             |  74%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++            |  76%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++           |  78%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++          |  80%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++         |  82%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++        |  84%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++       |  86%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++      |  88%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++     |  90%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++    |  92%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++   |  94%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++  |  96%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++++ |  98%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
outputmcmcCP
JAGS output for model '4', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 1,
yielding 36000 total samples from the joint posterior. 
MCMC ran for 0.058 minutes at time 2024-06-04 18:55:37.871628.

**WARNING** Some Rhat values could not be calculated.
**WARNING** Rhat values indicate convergence failure. 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 6.3 and DIC = -419.423 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(outputmcmcCP$samples[,c("sinv")], main="posterior sinv")

plot(outputmcmcCP$samples[,c("mu[5]")], main="posterior mu[5]")

plot(outputmcmcCP$samples[,c("mu[50]")], main="posterior mu[50]")


# Autocorrelation
autocorr.plot(outputmcmcCP$samples[,c("sinv")], main= "sinv ACF")

autocorr.plot(outputmcmcCP$samples[,c("mu[5]")], main="mu[5] ACF")

autocorr.plot(outputmcmcCP$samples[,c("mu[50]")], main="mu[50] ACF")

# Selecting the tau samples
tau_samples = outputmcmcCP$samples[[1]][, "Tau"]

# Calculate the mean
tmean <- mean(tau_samples)

# Calculate the 2.5% quantile
q1 <- quantile(tau_samples, probs = 0.05)

# Calculate the 97.5% quantile
q2 <- quantile(tau_samples, probs = 0.95)


# Finding the year corresponding to qi
year_q1 = year[floor(q1)]
year_q2 = year[floor(q2)]
year_tmean = year[floor(tmean)]



# Plot 
plot(year[1:length(delta_logdata_51)], delta_logdata_51, type='l', ylab="Delta log-co2", main="Delta log-co2", xlab="Year")

# lines for the change point
abline(v=year_tmean, col="red", lwd=1.5)
abline(v=year_q1, col="red", lwd=1.5, lty = 3)
abline(v=year_q2, col="red", lwd=1.5, lty = 3)


# Sampled mean
ssCP2 = summary(outputmcmcCP)
n2 = length(delta_logdata_51)
points(year[1:n2], ssCP2[1:n2,"mean"], col="green", pch=16, cex=0.6)




# Create a data frame to print the years
df <- data.frame(
  q1 = year_q1,
  Mean = year_tmean,
  q2 = year_q2
)
colnames(df) <- c("5%", "Mean", "95%")


# Print the data frame
print(df)

As we can see from the plots we can indeed spot a change in the mean of our model around 1973, with a 90% chance this change occurred between 1970 and 1978.

An interpretation of this finding could be that the worsened economic conditions caused by the economic recessions of that era may have contributed to a slowdown in CO2 emissions growth.

Regressions over the change points

Our analysis identified two potential turning points in the CO2 emission trend: 1951 and 1973. To gain a clearer visual understanding of these shifts, we’ll segment the data into three periods: before, between, and after these critical years. By fitting regression lines to the log of CO2 emissions for each period, we can directly visualize the changes in the emissions trajectory.

# Adding a columns for the log data
world_data$CO2_log = CO2_log

# Filtering for data up untile 1975 (End of the Post-War Economic Boom)
world_data_before1973 <- world_data[world_data$Year < 1973,]
world_data_after1973 <- world_data[world_data$Year > 1973,]


# Splitting the data in 'before' and 'after' the change-point
world_data_before1951 <- world_data_before1973[world_data_before1973$Year < 1951,]
world_data_after1951 <- world_data_before1973[world_data_before1973$Year > 1951,]


# Fitting some linear models
world_data_before1951.lm = lm(CO2_log ~ Year, data = world_data_before1951)
world_data_after1951.lm = lm(CO2_log ~ Year, data = world_data_after1951)
world_data_after1973.lm = lm(CO2_log ~ Year, data = world_data_after1973)

#Plots
plot(world_data$Year, world_data$CO2_log, type='l', col='darkgreen', ylab="log(Annual CO2)", main="log(CO2)", xlab="Year")
points(world_data$Year, world_data$CO2_log, col='darkgreen', pch=16, cex=0.5)

# Lines
beta_before_1951 = coef(world_data_before1951.lm)
beta_after_1951 = coef(world_data_after1951.lm)
beta_after_1973 = coef(world_data_after1973.lm)
abline(beta_before_1951, col='red', lty=3)
abline(beta_after_1951, col='green', lty=3)
abline(beta_after_1973, col='blue', lty=3)


# Legend
legend("topleft", legend=c("Before 1951", "Between 1951 and 1973", "After 1973"), col=c("red", "green", "blue"), lty=3)





# Plot 2
plot(world_data$Year, world_data$AnnualCO2, type='l', col='darkgreen', ylab="Annual CO2 (billion t)", main="CO2 Emissions for the World", xlab="Year")
points(world_data$Year, world_data$AnnualCO2, col='darkgreen', pch=16, cex=0.5)

# # Add a vertical line in the two change points
abline(v = 1951, col = "red", lwd = 1, lty = 3)
abline(v = 1973, col = "green", lwd = 1, lty = 3)

legend("topleft", legend=c("1951", "1973"), col=c("red", "green"), lty=3)

As we can see from the plots there is a clear shift in the speed of increase of emissions before and after the change points.

AR(1) model - Time series prediction

Building on the identified change points in CO2 emissions, a crucial next step is to explore what lies ahead.

The current estimate (2023) for the world’s remaining carbon budget for a 50% chance to stay under 1.5 °C (2.7 °F) is 250 gigatonnes CO2.

Can we predict when we might reach a critical level of CO2 emissions that would push global temperatures 1.5°C above pre-industrial levels?

We will carry on this analysis by fitting an AR(1) model with parameters \(\mu,\alpha\) and \(\sigma^2\) to the delta of the logarithm of CO2 emissions on data after 1978 (95% that the change point has happened).

We assume the following priors: \[ \begin{split} & \alpha \sim \mathcal{U}(-1,1) \\ & \mu\sim \mathcal{N}(0,10) \\ & \tau=\frac{1}{\sigma^2} \sim \mathcal{G}(0.001,0.001) \end{split} \]

We choose the priors for \(\mu\) and \(\frac{1}{\sigma^2}\) to be weakly informative.

# Ar(1)
modelAR.string <-"model {
  ## parameters: alpha, tau, m0
  # likeliohood
  mu[1] <- Y[1]

  for (i in 2:N) {
    Y[i] ~ dnorm(mu[i], tau)
    mu[i] <- m0 + alpha * Y[i-1]
  }

  # prediction out of sample
  ypOut[1] = Y[N]                   # The first sample is Y[N]!!!
  ypOut[2] ~ dnorm(m0 + alpha * Y[N], tau)
  for(k in 3:Npred){
    ypOut[k] ~ dnorm(m0 + alpha * ypOut[k-1], tau)
  }


  # prior
  # alpha ~ dnorm(0.0, 1)
  alpha ~ dunif(-1, 1)
  tau ~ dgamma(0.001, 0.001)        # weakly informative prior
  m0 ~ dnorm(0.0, 0.1)
  sigma2 <- 1 / tau
}"



# Filtering the data
world_data_after1978 <- world_data[world_data$Year > 1978,]

CO2_log_78 = log(world_data_after1978$AnnualCO2, 10)
n1 = length(CO2_log_78)

delta_logdata_78 = CO2_log_78[2:n1] - CO2_log_78[1:n1-1]
n2 = length(delta_logdata_78)

# Years 
year_78 = world_data_after1978$Year



# Parameters
Npred = 9 + 1         # horizon for out-of-sample prediction



line_data <- list("Y"=delta_logdata_78, "N" = length(delta_logdata_78), "Npred"=Npred)

outputmcmcAR <- jags(model.file=textConnection(modelAR.string),
                     data = line_data,
                     parameters.to.save = c('alpha', "sigma2","m0","ypOut", "tau"),
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000, 
                     n.thin = 5)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 42
   Unobserved stochastic nodes: 12
   Total graph size: 165

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |+                                                 |   2%
  |                                                        
  |++                                                |   4%
  |                                                        
  |+++                                               |   6%
  |                                                        
  |++++                                              |   8%
  |                                                        
  |+++++                                             |  10%
  |                                                        
  |++++++                                            |  12%
  |                                                        
  |+++++++                                           |  14%
  |                                                        
  |++++++++                                          |  16%
  |                                                        
  |+++++++++                                         |  18%
  |                                                        
  |++++++++++                                        |  20%
  |                                                        
  |+++++++++++                                       |  22%
  |                                                        
  |++++++++++++                                      |  24%
  |                                                        
  |+++++++++++++                                     |  26%
  |                                                        
  |++++++++++++++                                    |  28%
  |                                                        
  |+++++++++++++++                                   |  30%
  |                                                        
  |++++++++++++++++                                  |  32%
  |                                                        
  |+++++++++++++++++                                 |  34%
  |                                                        
  |++++++++++++++++++                                |  36%
  |                                                        
  |+++++++++++++++++++                               |  38%
  |                                                        
  |++++++++++++++++++++                              |  40%
  |                                                        
  |+++++++++++++++++++++                             |  42%
  |                                                        
  |++++++++++++++++++++++                            |  44%
  |                                                        
  |+++++++++++++++++++++++                           |  46%
  |                                                        
  |++++++++++++++++++++++++                          |  48%
  |                                                        
  |+++++++++++++++++++++++++                         |  50%
  |                                                        
  |++++++++++++++++++++++++++                        |  52%
  |                                                        
  |+++++++++++++++++++++++++++                       |  54%
  |                                                        
  |++++++++++++++++++++++++++++                      |  56%
  |                                                        
  |+++++++++++++++++++++++++++++                     |  58%
  |                                                        
  |++++++++++++++++++++++++++++++                    |  60%
  |                                                        
  |+++++++++++++++++++++++++++++++                   |  62%
  |                                                        
  |++++++++++++++++++++++++++++++++                  |  64%
  |                                                        
  |+++++++++++++++++++++++++++++++++                 |  66%
  |                                                        
  |++++++++++++++++++++++++++++++++++                |  68%
  |                                                        
  |+++++++++++++++++++++++++++++++++++               |  70%
  |                                                        
  |++++++++++++++++++++++++++++++++++++              |  72%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++             |  74%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++            |  76%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++           |  78%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++          |  80%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++         |  82%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++        |  84%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++       |  86%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++      |  88%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++     |  90%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++    |  92%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++   |  94%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++  |  96%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++++ |  98%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
outputmcmcAR
JAGS output for model '6', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 5,
yielding 7200 total samples from the joint posterior. 
MCMC ran for 0.011 minutes at time 2024-06-04 18:55:44.169105.

**WARNING** Some Rhat values could not be calculated.
Successful convergence based on Rhat values (all < 1.1). 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 9.8 and DIC = -256.802 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(outputmcmcAR$samples[,c('alpha')], main="posterior alpha")

plot(outputmcmcAR$samples[,c('sigma2')], main="posterior sigma2")

plot(outputmcmcAR$samples[,c('m0')], main="posterior m0")

plot(outputmcmcAR$samples[,c('tau')], main="posterior tau")



# Autocorrelation
autocorr.plot(outputmcmcAR$samples[,c('alpha')], main= "alpha ACF")

autocorr.plot(outputmcmcAR$samples[,c('sigma2')], main= "sigma2 ACF")

autocorr.plot(outputmcmcAR$samples[,c('m0')], main= "m0 ACF")

# Out of sample prediction
yp_pred = outputmcmcAR$mean$ypOut         # Here 'yp_pred' is the 'delta-log'
q1_pred = outputmcmcAR$q2.5$ypOut         # Credible interval
q2_pred = outputmcmcAR$q97.5$ypOut

# Years for prediction
new_years <- seq(2021, 2021 + Npred - 1)


# Plots
plot(year_78[1:length(delta_logdata_78)], delta_logdata_78, type='l', xlim = c(min(year_78), 2030), ylab="Delta log-co2", main="Delta log-co2 prediction", xlab="Year")
lines(new_years, yp_pred, pch="*", col="darkorange")
abline(v=min(new_years), col="orange", lty = 3)
# lines(new_years, q1_pred, type="l", col="orange", lwd = 1.5)
# lines(new_years, q2_pred, type="l", col="orange", lwd = 1.5)

legend("bottomleft", legend=c("Prediction"), col=c("darkorange"), lty=1)

We need now to convert the prediction from the Delta log CO2 to total Annual CO2.

# Reversing the delta-log relation
delta_log_predicted = yp_pred[2:(Npred)]    # discard the first one (last data point)
last_log_point = world_data$CO2_log[121]

log_yp_pred <- array(0, dim = c(length(delta_log_predicted)))
log_yp_pred[1] = last_log_point + delta_log_predicted[1]

# calculating log_yp_pred
for (i in seq(length(delta_log_predicted) - 1)){
  log_yp_pred[i+1] = log_yp_pred[i] + delta_log_predicted[i+1]
}

# Final values in Billions of tons
yp = 10^log_yp_pred


# Years for AnnualCo2
new_years_p = new_years[2:length(new_years)] + 1   # remove the first and shift by 1



# Calculating the critical year
CO2_bucket = 250
i = 0
while (CO2_bucket > 0){
  i = i+1
  critical_year = new_years_p[i]
  CO2_bucket = CO2_bucket - yp[i]


}



# Plots
plot(world_data$Year, world_data$AnnualCO2, type='l', col='darkgreen', ylab="Annual CO2 (billion t)", main="CO2 Emissions for the World", xlab="Year", xlim = c(min(world_data$Year), 2030), ylim = c(min(world_data$AnnualCO2), 42))
points(world_data$Year, world_data$AnnualCO2, col='darkgreen', pch=16, cex=0.5)

# Prediction
lines(new_years_p, yp, pch="*", col="darkorange")
points(new_years_p, yp, pch=16, cex=0.5, col="darkorange")
points(critical_year, yp[i], pch=1, cex=1, lwd=2, col="red")

# Critical year line
abline(v=critical_year, col="red", lty = 3)

# Add a legend
legend("topleft", legend=critical_year, pch=1, col="red", pt.cex=1, pt.lwd=2)

Based on our analysis, continuing the current emissions trajectory could push us towards 1.5°C warming by 2029.

White Noise Model with switching variance

In our previous analyses, we have examined the trends in the increase of CO2 emissions.

Now we want to ask a different question: can we detect global crisis and major worldwide events by looking at CO2 emissions alone?

Do they cause a noticeable variance in the trend of CO2 emissions?

We will carry on this analysis by fitting a white noise model with switching variance on the increment of the log of CO2 emissions.

We will split our data by leveraging the change points discovered in two sub-datasets: years before 1949 (5% quantile of the change point on the variance) and after 1978 (95% quantile of the change point on the mean).

After 1978

We start our analysis with the years after 1978.

The model is as follows:\[ x_t :=\log(y_{t+1})-\log(y_t) \] and we assume that \[ x_t \stackrel{iid}{\sim} \mathcal{N}(\mu,\sigma_t^2) \] with \[ \sigma_t^{-2}=\beta_1+\beta_2 \delta_t \qquad \delta_t \sim Ber(p) \]

We assume the following priors:\[ \begin{split} & \beta_1 \sim \mathcal{G}(0.001, 0.001) \\ & \beta_2 \sim \mathcal{G}(0.001, 0.001) \\ & \delta_t \sim Ber(p) \\ & p \sim Beta(1,1) \\ & \mu\sim \mathcal{N}(0,10) \\ \end{split} \]

We choose the priors for \(\mu\), \(\beta_1\), \(\beta_2\) and \(p\) to be weakly informative.

# Filtering for data before 1949 and after 1978
world_data_after1978 <- world_data[world_data$Year > 1978,]
world_data_before1949 <- world_data[world_data$Year < 1949,]



# After 1978
CO2_log_78 = log(world_data_after1978$AnnualCO2, 10)
n1 = length(CO2_log_78)

delta_logdata_78 = CO2_log_78[2:n1] - CO2_log_78[1:n1-1]

# Years 
year_78 = world_data_after1978$Year



# Before 1949
CO2_log_49 = log(world_data_before1949$AnnualCO2, 10)
n1 = length(CO2_log_49)

delta_logdata_49 = CO2_log_49[2:n1]-CO2_log_49[1:n1-1]

# Years 
year_49 = world_data_before1949$Year

To make the variability of the data more enhanced we apply two transformations:

  • Firstly we normalize the data

  • Then we elevate to the power 3

This makes outliers in the data easier to spot.

# Enchancing the data
# Normalization step
mean_val <- mean(delta_logdata_78)
sd_val <- sd(delta_logdata_78)

delta_logdata_78_norm <- (delta_logdata_78 - mean_val) / sd_val

# To enhance the varability in the data we evevate it power 3
delta_logdata_78_p3 = delta_logdata_78_norm^3


# Plots
# Normal
plot(year_78[1:length(delta_logdata_78)], delta_logdata_78, ylab="Delta log-co2", main="Delta log-co2 after 1978", xlab="Year")


# Enhanced
plot(year_78[1:length(delta_logdata_78_p3)], delta_logdata_78_p3, ylab="Delta log-co2", main="Enchanced Delta log-co2 after 1978", xlab="Year")

model4.string <-"model {
  #likeliohood 
  for(i in 1:N){
    x[i] ~ dnorm(mu, inv.var[i])
    inv.var[i] <- beta[1] + beta[2] * d[i]
  }
  
  # Prior for d[i]
  for(k in 1:N){
    d[k] ~ dbern(p)             # probabilities
  }
  
  # Prior for beta
    # beta[1] ~ dexp(0.1)
    # beta[2] ~ dexp(0.1)
    beta[1] ~ dgamma(0.001, 0.001)    # Non informative
    beta[2] ~ dgamma(0.001, 0.001)
    
  # Prior for beta
   p ~ dbeta(1,1)                 
   
  # Prior for the mean
  mu   ~ dnorm(0, 0.1)
}"

# After 1978
data_78 <- list("x" = delta_logdata_78_p3, "N" = length(delta_logdata_78_p3))
samp_78 <- jags(model.file = textConnection(model4.string),
                     data=data_78,
                     parameters.to.save= c("inv.var", "d", "mu"),
                     n.adapt=1000, n.iter=50000, n.chains = 1, n.burnin = 2000,
                     n.thin = 5)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 43
   Unobserved stochastic nodes: 47
   Total graph size: 181

Initializing model

Adaptive phase, 1000 iterations x 1 chains 
If no progress bar appears JAGS has decided not to adapt 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |+                                                 |   2%
  |                                                        
  |++                                                |   4%
  |                                                        
  |+++                                               |   6%
  |                                                        
  |++++                                              |   8%
  |                                                        
  |+++++                                             |  10%
  |                                                        
  |++++++                                            |  12%
  |                                                        
  |+++++++                                           |  14%
  |                                                        
  |++++++++                                          |  16%
  |                                                        
  |+++++++++                                         |  18%
  |                                                        
  |++++++++++                                        |  20%
  |                                                        
  |+++++++++++                                       |  22%
  |                                                        
  |++++++++++++                                      |  24%
  |                                                        
  |+++++++++++++                                     |  26%
  |                                                        
  |++++++++++++++                                    |  28%
  |                                                        
  |+++++++++++++++                                   |  30%
  |                                                        
  |++++++++++++++++                                  |  32%
  |                                                        
  |+++++++++++++++++                                 |  34%
  |                                                        
  |++++++++++++++++++                                |  36%
  |                                                        
  |+++++++++++++++++++                               |  38%
  |                                                        
  |++++++++++++++++++++                              |  40%
  |                                                        
  |+++++++++++++++++++++                             |  42%
  |                                                        
  |++++++++++++++++++++++                            |  44%
  |                                                        
  |+++++++++++++++++++++++                           |  46%
  |                                                        
  |++++++++++++++++++++++++                          |  48%
  |                                                        
  |+++++++++++++++++++++++++                         |  50%
  |                                                        
  |++++++++++++++++++++++++++                        |  52%
  |                                                        
  |+++++++++++++++++++++++++++                       |  54%
  |                                                        
  |++++++++++++++++++++++++++++                      |  56%
  |                                                        
  |+++++++++++++++++++++++++++++                     |  58%
  |                                                        
  |++++++++++++++++++++++++++++++                    |  60%
  |                                                        
  |+++++++++++++++++++++++++++++++                   |  62%
  |                                                        
  |++++++++++++++++++++++++++++++++                  |  64%
  |                                                        
  |+++++++++++++++++++++++++++++++++                 |  66%
  |                                                        
  |++++++++++++++++++++++++++++++++++                |  68%
  |                                                        
  |+++++++++++++++++++++++++++++++++++               |  70%
  |                                                        
  |++++++++++++++++++++++++++++++++++++              |  72%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++             |  74%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++            |  76%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++           |  78%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++          |  80%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++         |  82%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++        |  84%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++       |  86%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++      |  88%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++     |  90%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++    |  92%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++   |  94%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++  |  96%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++++ |  98%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

 Burn-in phase, 2000 iterations x 1 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 48000 iterations x 1 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samp_78
JAGS output for model '7', generated by jagsUI.
Estimates based on 1 chains of 50000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 5,
yielding 9600 total samples from the joint posterior. 
MCMC ran for 0.033 minutes at time 2024-06-04 18:55:45.815875.

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 13.9 and DIC = 117.753 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(samp_78$samples[,c('mu')], main="posterior mu")

plot(samp_78$samples[,c('inv.var[42]')], main="posterior inv.var[42]")




# Autocorrelation
autocorr.plot(samp_78$samples[,c('mu')], main="posterior mu")

autocorr.plot(samp_78$samples[,c('inv.var[42]')], main="posterior inv.var[42]")

We now plot the bayesian estimate of \(\sigma^{-2}_t\). We can use these estimates to obtain a classification of the observations according to the value of the variance.

Here we choose to divide the variances in two classes using the latent variables \(\delta_t\) (the probability of belonging to the lower variance group).

We may interpret the red line as periods of high volatility.

# Getting inv.var and 'd[i]'
inv.var = samp_78$mean$inv.var
tauest = samp_78$mean$d        # tauest is the probability 'd[i]' 


# Plotting the variance
var = 1 / inv.var
plot(year_78[1:length(delta_logdata_78_p3)], var, xlab="Year", ylab="posterior variance", main="posterior variance")



# Plotting the probabilities
plot(year_78[1:length(delta_logdata_78_p3)], tauest, xlab="Year", ylab="posterior probability", main="posterior probability")
abline(h=0.2, col="red")

# abline(h=0.25, col="orange")



# Plots 3 & 4
# Selecting the red points
ii = seq(1:length(year_78))
oo = ii[tauest < 0.2]      # Higher variance means a lower tau


# Plot in the delta log domain
plot(year_78[1:length(delta_logdata_78)], delta_logdata_78, main = "Delta log-co2 after 1978", ylab="Delta log-co2", xlab="Year")
lines(year_78[oo], delta_logdata_78[oo], type="p", col="red")

# The lines / red points indicate months with high variance
for(k in oo){
  abline(v = year_78[k], col="red", lty = 3)
}




# Plot in the AnnualCo2 domain
plot(year_78, world_data_after1978$AnnualCO2, type='l', col='darkgreen', ylab="Annual CO2 (billion t)", main="CO2 Emissions for the World", xlab="Year")
points(year_78, world_data_after1978$AnnualCO2, col='darkgreen', pch=16, cex=0.5)
lines(year_78[oo], world_data_after1978$AnnualCO2[oo], type="p", col="red")

# The lines / red points indicate years with high variance
for(k in oo){
  abline(v=year_78[k], col="red", lty = 3)
}

# Add a legend
legend("topleft", legend="Significative change with consecutive year", pch=1, col="red", pt.cex=1, pt.lwd=2, cex=0.8)



# We can suppose that years with high variace indicate crisis
year_78[oo]
[1] 1980 1991 2002 2008 2009 2019 2020

The years with the most significant variance in CO2 emission trends are: 1980, 1991, 2002, 2008, 2009, 2019, 2020.

Those years indicate periods where the subsequent year experienced a noticeable change in CO2 emissions (we analysed the delta of the data) and can be directly linked with major global economic phenomena:

  • 1980: Early 1980s Recession, decrease in CO2 emissions.

  • 1991: Dissolution of the Soviet Union and Early 1990s Recession, decrease in CO2 emissions.

  • 2002: Introduction of the Euro, 11/09/2021 attacks, increase in CO2 emissions.

  • 2008/2009: Global Financial Crisis, decrease in CO2 emissions.

  • 2019/2020: Covid-19 Pandemic, decrease in CO2 emissions.

Before 1949

We will now repeat the same analysis for the years before 1949.

# Enchancing the data
# Normalization step
mean_val <- mean(delta_logdata_49)
sd_val <- sd(delta_logdata_49)

delta_logdata_49_norm <- (delta_logdata_49 - mean_val) / sd_val


# To enhance the varability in the data we evevate it power 3
delta_logdata_49_p3 = delta_logdata_49_norm^3


# Plots
# Normal
plot(year_49[1:length(delta_logdata_49)], delta_logdata_49, ylab="Delta log-co2", main="Delta log-co2 before 1949", xlab="Year")


# Enhanced
plot(year_49[1:length(delta_logdata_49_p3)], delta_logdata_49_p3, ylab="Delta log-co2", main="Enchanced Delta log-co2 before 1949", xlab="Year")

The general variance between datapoints is higher in this period. To obtain more extreme results we introduce a strong bias with respect to lower variance in the model and we change the priors to:

\[ \begin{split} & \beta_1 \sim \mathcal{E}(10) \\ & \beta_2 \sim \mathcal{E}(10) \\ & \delta_t \sim Ber(p) \\ & p \sim Beta(1,1) \\ & \mu\sim \mathcal{N}(0,10) \\ \end{split} \]

We choose the priors for \(\mu\), and \(p\) to be weakly informative, while for \(\beta_1\) and \(\beta_2\) we injected a strong bias toward values near zero (higher parameter of the exponential distribution).

Oss: We are practicly telling the model that the data has high variance (as we can see from the plotted data) and it needs to learn a \(\delta_t\) to classify the points with lower variance.

model4.string <-"model {
  #likeliohood
  for(i in 1:N){
    x[i] ~ dnorm(mu, inv.var[i])
    inv.var[i] <- beta[1] + beta[2] * d[i]
  }

  # Prior for d[i]
  for(k in 1:N){
    d[k] ~ dbern(p)             # probabilities
  }

  # Prior for beta
    beta[1] ~ dexp(10)       # Strong prior to generate more extreme results
    beta[2] ~ dexp(10)
    # beta[1] ~ dgamma(0.001, 0.001)    # Non informative
    # beta[2] ~ dgamma(0.001, 0.001)

  # Prior for beta
   p ~ dbeta(1,1)

  # Prior for the mean
  mu   ~ dnorm(0, 0.1)
}"


# After 1978
data_49 <- list("x" = delta_logdata_49_p3, "N" = length(delta_logdata_49_p3))
samp_49 <- jags(model.file = textConnection(model4.string),
                     data=data_49,
                     parameters.to.save= c("inv.var", "d", "mu"),
                     n.adapt=1000, n.iter=50000, n.chains = 1, n.burnin = 2000,
                     n.thin = 5)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 47
   Unobserved stochastic nodes: 51
   Total graph size: 197

Initializing model

Adaptive phase, 1000 iterations x 1 chains 
If no progress bar appears JAGS has decided not to adapt 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |+                                                 |   2%
  |                                                        
  |++                                                |   4%
  |                                                        
  |+++                                               |   6%
  |                                                        
  |++++                                              |   8%
  |                                                        
  |+++++                                             |  10%
  |                                                        
  |++++++                                            |  12%
  |                                                        
  |+++++++                                           |  14%
  |                                                        
  |++++++++                                          |  16%
  |                                                        
  |+++++++++                                         |  18%
  |                                                        
  |++++++++++                                        |  20%
  |                                                        
  |+++++++++++                                       |  22%
  |                                                        
  |++++++++++++                                      |  24%
  |                                                        
  |+++++++++++++                                     |  26%
  |                                                        
  |++++++++++++++                                    |  28%
  |                                                        
  |+++++++++++++++                                   |  30%
  |                                                        
  |++++++++++++++++                                  |  32%
  |                                                        
  |+++++++++++++++++                                 |  34%
  |                                                        
  |++++++++++++++++++                                |  36%
  |                                                        
  |+++++++++++++++++++                               |  38%
  |                                                        
  |++++++++++++++++++++                              |  40%
  |                                                        
  |+++++++++++++++++++++                             |  42%
  |                                                        
  |++++++++++++++++++++++                            |  44%
  |                                                        
  |+++++++++++++++++++++++                           |  46%
  |                                                        
  |++++++++++++++++++++++++                          |  48%
  |                                                        
  |+++++++++++++++++++++++++                         |  50%
  |                                                        
  |++++++++++++++++++++++++++                        |  52%
  |                                                        
  |+++++++++++++++++++++++++++                       |  54%
  |                                                        
  |++++++++++++++++++++++++++++                      |  56%
  |                                                        
  |+++++++++++++++++++++++++++++                     |  58%
  |                                                        
  |++++++++++++++++++++++++++++++                    |  60%
  |                                                        
  |+++++++++++++++++++++++++++++++                   |  62%
  |                                                        
  |++++++++++++++++++++++++++++++++                  |  64%
  |                                                        
  |+++++++++++++++++++++++++++++++++                 |  66%
  |                                                        
  |++++++++++++++++++++++++++++++++++                |  68%
  |                                                        
  |+++++++++++++++++++++++++++++++++++               |  70%
  |                                                        
  |++++++++++++++++++++++++++++++++++++              |  72%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++             |  74%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++            |  76%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++           |  78%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++          |  80%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++         |  82%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++        |  84%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++       |  86%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++      |  88%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++     |  90%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++    |  92%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++   |  94%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++  |  96%
  |                                                        
  |+++++++++++++++++++++++++++++++++++++++++++++++++ |  98%
  |                                                        
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%

 Burn-in phase, 2000 iterations x 1 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 48000 iterations x 1 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samp_49
JAGS output for model '8', generated by jagsUI.
Estimates based on 1 chains of 50000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 5,
yielding 9600 total samples from the joint posterior. 
MCMC ran for 0.038 minutes at time 2024-06-04 18:55:48.670976.

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 68.8 and DIC = 223.747 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(samp_49$samples[,c('mu')], main="posterior mu")
plot(samp_49$samples[,c('inv.var[12]')], main="posterior inv.var[12]")



# Autocorrelation
autocorr.plot(samp_49$samples[,c('mu')], main="posterior mu")

autocorr.plot(samp_49$samples[,c('inv.var[12]')], main="posterior inv.var[12]")

# Getting inv.var and 'd[i]'
inv.var = samp_49$mean$inv.var
tauest = samp_49$mean$d        # tauest is the probability 'd[i]' 


# Plotting the variance
var = 1 / inv.var
plot(year_49[1:length(delta_logdata_49_p3)], var, xlab="Year", ylab="posterior variance", main="posterior variance")



# Plotting the probabilities
plot(year_49[1:length(delta_logdata_49_p3)], tauest, xlab="Year", ylab="posterior probability", main="posterior probability")
abline(h=0.2, col="red")

# abline(h=0.25, col="orange")



# Plots 3 & 4
# Selecting the red points
ii = seq(1:length(year_49))
oo = ii[tauest < 0.2]      # Higher variance means a lower tau


# Plot in the delta log domain
plot(year_49[1:length(delta_logdata_49)], delta_logdata_49, main = "Delta log-co2 before 1949", ylab="Delta log-co2", xlab="Year")
lines(year_49[oo], delta_logdata_49[oo], type="p", col="red")

# The lines / red points indicate months with high variance
for(k in oo){
  abline(v = year_49[k], col="red", lty = 3)
}




# Plot in the AnnualCo2 domain
plot(year_49, world_data_before1949$AnnualCO2, type='l', col='darkgreen', ylab="Annual CO2 (billion t)", main="CO2 Emissions for the World", xlab="Year")
points(year_49, world_data_before1949$AnnualCO2, col='darkgreen', pch=16, cex=0.5)
lines(year_49[oo], world_data_before1949$AnnualCO2[oo], type="p", col="red")

# The lines / red points indicate years with high variance
for(k in oo){
  abline(v=year_78[k], col="red", lty = 3)
}

# Add a legend
legend("topleft", legend="Significative change with consecutive year", pch=1, col="red", pt.cex=1, pt.lwd=2, cex=0.8)



# We can suppose that years with high variace indicate crisis
year_49[oo]
[1] 1913 1918 1919 1920 1930 1931 1944

The years with the most significant variance in CO2 emission trends are: 1913, 1918 ,1919, 1920, 1930, 1931, 1944.

Those years indicate periods where the subsequent year experienced a noticeable change in CO2 emissions (we analysed the delta of the data) and can be directly linked with major global economic phenomena:

  • 1913: Beginning of World War I (1914)

  • 1918/1919/1920: End of World War I (1918) and aftermath

  • 1930/1931: The Great Depression (1929–1939)

  • 1944: End of World War II (1945)

Disclaimer: The years between 1900 and 1945 were troubled and a lot of significant events happened in that period. This makes the general variability between each year more accentuated and as such significant events are harder to spot.

#

Dataset 2

We will continue our analysis by analyzing the impact of various factors on CO2 emissions in recent years.

Sources:

https://ourworldindata.org/grapher/energy-use-per-capita-vs-gdp-per-capita

https://ourworldindata.org/grapher/co2-emissions-vs-gdp

https://ourworldindata.org/grapher/low-carbon-energy-consumption?country=OMN

https://ourworldindata.org/grapher/urbanization-vs-gdp

https://ourworldindata.org/grapher/number-of-internet-users-by-country

Short description:

This dataset focuses on human emissions of CO2 and other greenhouse gases, which are primary drivers of climate change and one of the world’s most pressing challenges. It includes data for various nations and years (2006 to 2009), encompassing the following variables:

Transformations to the original dataset

To facilitate our analysis we will apply some transformations to the data.

The final structure will be the following:

  • country: name of the country.

  • y: year.

  • EnergyUse: Energy use [tons of oil equivalent per capita].

  • GDP: Gross Domestic Product per capita. [1000$ per capita]

  • pop: Population (historical estimates). [milions people]

  • co2percap: Annual CO2 emissions per capita. [tons per capita]

  • Lowcarbon_energy: Low-carbon energy (% sub energy). Low-carbon energy is de fined as the sum of nuclear and renewable sources. Renewable sources include hydropower, solar, wind, geothermal, wave and tidal and bioenergy. Traditional biofuels are not included.

  • urb: urban population. [%]

  • internet: number of internet users (OWID based on WB & UN).

  • internet_users_ratio: ratio of internet users over the total population.

rm(list=ls())

library(rjags)
Avvertimento: il pacchetto ‘rjags’ è stato creato con R versione 4.3.3
Caricamento del pacchetto richiesto: coda
Avvertimento: il pacchetto ‘coda’ è stato creato con R versione 4.3.3
Linked to JAGS 4.3.1
Loaded modules: basemod,bugs
library(bayesplot)
Avvertimento: il pacchetto ‘bayesplot’ è stato creato con R versione 4.3.3
This is bayesplot version 1.11.1
- Online documentation and vignettes at mc-stan.org/bayesplot
- bayesplot theme set to bayesplot::theme_default()
   * Does _not_ affect other ggplot2 plots
   * See ?bayesplot_theme_set for details on theme setting
library(jagsUI)
Avvertimento: il pacchetto ‘jagsUI’ è stato creato con R versione 4.3.3

Caricamento pacchetto: ‘jagsUI’

Il seguente oggetto è mascherato da ‘package:coda’:

    traceplot
library(loo)
Avvertimento: il pacchetto ‘loo’ è stato creato con R versione 4.3.3
This is loo version 2.7.0
- Online documentation and vignettes at mc-stan.org/loo
- As of v2.0.0 loo defaults to 1 core but we recommend using as many as possible. Use the 'cores' argument or set options(mc.cores = NUM_CORES) for an entire session. 
- Windows 10 users: loo may be very slow if 'mc.cores' is set in your .Rprofile file (see https://github.com/stan-dev/loo/issues/94).
# Loading the data
CO2 <- read.csv("Data/CO2.csv")
# Removing the 'World' datapoints
CO2 <- CO2[CO2$country != 'World',]
head(CO2)
summary(CO2)
       X            country                y          EnergyUse           GDP              pop           
 Min.   :   6.0   Length:359         Min.   :2005   Min.   :  1907   Min.   :  2280   Min.   :2.950e+05  
 1st Qu.: 287.5   Class :character   1st Qu.:2006   1st Qu.: 17651   1st Qu.: 11415   1st Qu.:6.028e+06  
 Median :1341.0   Mode  :character   Median :2007   Median : 31897   Median : 23103   Median :2.018e+07  
 Mean   :1397.1                      Mean   :2007   Mean   : 37667   Mean   : 28101   Mean   :7.639e+07  
 3rd Qu.:2452.5                      3rd Qu.:2008   3rd Qu.: 47482   3rd Qu.: 43062   3rd Qu.:6.169e+07  
 Max.   :3294.0                      Max.   :2009   Max.   :196676   Max.   :114889   Max.   :1.361e+09  
   co2percap      Lowcarbon_energy    internet              urb        
 Min.   : 0.271   Min.   : 0.001   Min.   :    47416   Min.   : 18.24  
 1st Qu.: 3.920   1st Qu.: 2.957   1st Qu.:  2143640   1st Qu.: 55.49  
 Median : 6.823   Median :11.868   Median :  5145879   Median : 68.50  
 Mean   : 7.617   Mean   :15.362   Mean   : 17773004   Mean   : 67.42  
 3rd Qu.:10.060   3rd Qu.:19.113   3rd Qu.: 14756650   3rd Qu.: 80.53  
 Max.   :34.571   Max.   :81.746   Max.   :390747678   Max.   :100.00  
# Calculate the ratio of internet users to population
CO2$internet_users_ratio = CO2$internet / CO2$pop * 100
# Rescaling some data
CO2$GDP = CO2$GDP / 1000
CO2$EnergyUse = CO2$EnergyUse / 1000
CO2$pop = CO2$pop / 1000000



# Colour palette
library(RColorBrewer)
num_countries <- length(unique(CO2$country))
palette_colors <- colorRampPalette(brewer.pal(12, "Set1"))(num_countries)
Avvertimento in brewer.pal(12, "Set1"):
  n too large, allowed maximum for palette Set1 is 9
Returning the palette you asked for with that many colors
# Plotting the data by country
plot(CO2$GDP, CO2$co2percap, 
     xlab = "GDP [1K$]", ylab = "CO2 per capita [tons]", 
     log = "xy", 
     col = palette_colors[as.numeric(factor(CO2$country))]
     )


legend("topleft", legend="Each colour represents a country", cex=0.7)

Density & Exploratory data analysis

We start our analysis by plotting the densities and visually representing the data in relation to CO2 emissions. This preliminary examination helps us understand the distribution and relationships within the data.

library(ggplot2)
Avvertimento: il pacchetto ‘ggplot2’ è stato creato con R versione 4.3.3
library(gridExtra)
Avvertimento: il pacchetto ‘gridExtra’ è stato creato con R versione 4.3.3
plot_hist_scatter <- function(data, hist_var, scatter_var_x, scatter_var_y,
                              name_hist_var, name_x, name_y, unit_x, unit_y,
                              log_scale = FALSE, bins = 20) 
{
  # Plot histogram
  hist =
    ggplot(data=data, aes_string(x=hist_var)) +
    geom_histogram(aes(y=after_stat(density)), color='steelblue',
                   fill='lightblue', bins = bins) +
    ggtitle(paste("Histogram of", name_hist_var)) + 
    xlab(name_hist_var)
    ylab("Density")

  # Plot scatter plot
  scatter =
    ggplot(data=data, aes_string(x=scatter_var_x, y=scatter_var_y)) +
    geom_point(color='steelblue') +
    ggtitle(paste(name_y, "vs.", name_x)) +
    xlab(paste(name_x, unit_x)) +
    ylab(paste(name_y, unit_y))


  # Apply logarithmic scale if log_scale is TRUE
  if (log_scale) {
    scatter = scatter + scale_x_log10() + scale_y_log10() + ggtitle(paste(name_y,
                "vs.",name_x, "(log scale)"))
  }

  # Arrange plots
  gridExtra::grid.arrange(hist, scatter, ncol=2)
}


# Plots
plot_hist_scatter(CO2, hist_var="co2percap", "GDP", "co2percap", name_hist_var= "CO2 per cap", name_x="GDP", name_y="CO2 per cap", unit_x="[1k$]", unit_y="[tons]", bins = 10, log_scale = TRUE)
Avvertimento: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

plot_hist_scatter(CO2, hist_var="GDP", "GDP", "co2percap", name_hist_var="GDP", name_x="GDP", name_y="CO2 per cap", unit_x="[1k$]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="EnergyUse", "EnergyUse", "co2percap", name_hist_var="Energy Use", name_x="Energy Use", name_y="CO2 per cap", unit_x="[tons oil eq. per cap]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="pop", "pop", "co2percap", name_hist_var="Population", name_x="Population", name_y="CO2 per cap", unit_x="[Millions]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="Lowcarbon_energy", "Lowcarbon_energy", "co2percap", name_hist_var="Lowcarbon energy", name_x="Lowcarbon energy", name_y="CO2 per cap", unit_x="[% sub energy]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="urb", "urb", "co2percap", name_hist_var="Urbanization", name_x="Urbanization", name_y="CO2 per cap", unit_x="[%]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="internet_users_ratio", "internet_users_ratio", "co2percap", name_hist_var="Internet users ratio", name_x="Internet users ratio", name_y="CO2 per cap", unit_x="[%]", unit_y="[tons]", bins = 10)

Correlation Analysis

In this section, we examine the correlations between various covariates.

# Create a subset of the data removing the unused covariates
CO2_subset <- CO2[, c("EnergyUse", "GDP", "pop", "co2percap", "Lowcarbon_energy", "urb", "internet_users_ratio")]

head(CO2)

# Boxplots:
par(mfrow=c(1, 1), pty="m")
boxplot(scale(CO2_subset), las=3, main="Standardized covariates", cex.axis=0.75)

# Correlation matrix:
par(mfrow=c(1, 1), pty="s")

image(1:ncol(CO2_subset), 1:ncol(CO2_subset), cor(CO2_subset),
      xlab="", ylab="", main="Correlation between predictors",
      axes=FALSE)
axis(1,1:ncol(CO2_subset), colnames(CO2_subset), las=2,cex.axis=0.9)
axis(2,1:ncol(CO2_subset), colnames(CO2_subset), las=2,cex.axis=0.9)

The features with the highest correlation with CO2 emissions per capita (co2percap) are EnergyUse, GDP, and internet_user_ratio.

Spike and slab prior

To determine the most impactful variables for our analysis, and perform varaible selection, we will employ a Bayesian approach using the Spike-and-Slab prior on the normalized data.

The spike & slab prior for a linear regression model is

\[ \begin{align*} \beta_j \mid \gamma_j &\overset{ind}\sim (1-\gamma_j)\,\delta_{(0)} + \gamma_j\,\mathcal{N}\left(0, \sigma^2_{\beta_j}\right), \\ \gamma_j \mid \theta_j &\overset{ind}\sim \mathcal{B}e\left(\theta_j\right), \\[5pt] \theta_{j} &\overset{iid}\sim p\left(\theta_j\right), \end{align*} \]

where \(\theta_j\) is a probability which determines whether \(\beta_j\) is nonzero and hence whether the corresponding covariate will be included in the model and \(\sigma^2_{\beta_j} = 1\).

library(rjags)

head(CO2_subset)
# Spike and slab model
model_string = textConnection(
"model {
  # Likelihood 
  for (i in 1:N) {
    Y[i] ~ dnorm(beta0 + inprod(X[i,], beta[]), inv.var.y)
  }
  
  # Priors
  inv.var.y ~ dgamma(0.01, 0.01)
  beta0 ~ dnorm(0, 0.001)
  
  for(j in 1:P) {
    inv_var_beta[j] = 1 / var_beta[j]
  }

  for(j in 1:P) {
    beta[j] = g[j] * betaTemp[j]
    betaTemp[j] ~ dnorm(0, inv_var_beta[j])
  
    g[j] ~ dbern(theta[j])                     
    theta[j] ~ dunif(0, 1)
  }
  
}")


# Model settings:
Y = CO2_subset$co2percap

# We standardise the data to help the algorithm
X = within(CO2_subset, rm("co2percap"))
X_norm = scale(X)                         # Standardization step
P = ncol(X)
N = nrow(X)

# Data:
var_beta=rep(1, P)
dataList = list(Y=Y, X=X_norm, var_beta=var_beta, N=N, P=P)


# Specify the initial values:
inits = list(beta0=0, betaTemp=rep(0,P), g=rep(0,P), theta=rep(0.5,P))


# Jags 2
samples <- jags(model.file = model_string,
                     data=dataList,
                     # inits=inits,
                     parameters.to.save= c("beta0", "beta", "g"),
                     n.adapt=1000, n.iter=20000, n.chains = 3, n.burnin = 5000,
                     n.thin = 2)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 359
   Unobserved stochastic nodes: 20
   Total graph size: 3630

Initializing model

Adaptive phase, 1000 iterations x 3 chains 
If no progress bar appears JAGS has decided not to adapt 
 

 Burn-in phase, 5000 iterations x 3 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 15000 iterations x 3 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samples
JAGS output for model '7', generated by jagsUI.
Estimates based on 3 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 5000 iterations and thin rate = 2,
yielding 22500 total samples from the joint posterior. 
MCMC ran for 0.34 minutes at time 2024-06-16 15:58:28.932887.

**WARNING** Some Rhat values could not be calculated.
Successful convergence based on Rhat values (all < 1.1). 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 6.5 and DIC = 1533.112 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
# beta0
plot(samples$samples[,c('beta0')], main="posterior beta0")


# beta[i]
for(k in 1:P){
  param_name <- paste0("beta[", k, "]")  # Construct the parameter name dynamically
  plot(samples$samples[, param_name], main = paste("Posterior of", param_name))
}


# g[i]
for(k in 1:P){
  param_name <- paste0("g[", k, "]")  # Construct the parameter name dynamically
  plot(samples$samples[, param_name], main = paste("Posterior of", param_name))
}

Here we can visualize the posterior probability of inclusion that corresponds to the posterior mean of the \(\gamma_j\), which are called g in the code.

ss = summary(samples)
post_mean_g = ss[8:13, "mean"]
post_mean_g 
     g[1]      g[2]      g[3]      g[4]      g[5]      g[6] 
1.0000000 1.0000000 0.1080000 1.0000000 0.1295111 0.1720000 

We can visualize them with a nice chart.

# Load the library:
library(ggplot2)

postmeang_df = data.frame(value=post_mean_g, var=colnames(X))
p1 = ggplot(data=postmeang_df, aes(y=value,x=var,fill=var)) + 
  geom_bar(stat="identity") + 
  geom_hline(mapping=aes(yintercept=0.5), col=2, lwd=1.1) +
  coord_flip() + theme_minimal() + theme(legend.position="none") + 
  ylab("Posterior inclusion probabilities") + xlab("")
p1

The posterior probability of inclusion plot reveals some interesting results. The model shows a strong preference, assigning a probability of 1 to Lowcarbon_energy, GDP, and EnergyUse, while assigning near-zero probabilities to urbanization, population, and internet_user_ratio.

These results are interesting. While the high inclusion probabilities for GDP and EnergyUse are consistent with their strong correlation with co2percap, the high probability for Lowcarbon_energy is surprising given its low correlation with co2percap.

plot_hist_scatter(CO2, hist_var="co2percap", "GDP", "co2percap", name_hist_var= "CO2 per cap", name_x="GDP", name_y="CO2 per cap", unit_x="[1k$]", unit_y="[tons]", bins = 10, log_scale = TRUE)


plot_hist_scatter(CO2, hist_var="GDP", "GDP", "co2percap", name_hist_var="GDP", name_x="GDP", name_y="CO2 per cap", unit_x="[1k$]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="EnergyUse", "EnergyUse", "co2percap", name_hist_var="Energy Use", name_x="Energy Use", name_y="CO2 per cap", unit_x="[tons oil eq. per cap]", unit_y="[tons]", bins = 10, log_scale = TRUE)


plot_hist_scatter(CO2, hist_var="EnergyUse", "EnergyUse", "co2percap", name_hist_var="Energy Use", name_x="Energy Use", name_y="CO2 per cap", unit_x="[tons oil eq. per cap]", unit_y="[tons]", bins = 10)


plot_hist_scatter(CO2, hist_var="Lowcarbon_energy", "Lowcarbon_energy", "co2percap", name_hist_var="Lowcarbon energy", name_x="Lowcarbon energy", name_y="CO2 per cap", unit_x="[% sub energy]", unit_y="[tons]", bins = 10)



# Posterior means of the betas
post_mean_b = ss[c(2, 3, 5), "mean"]
post_mean_b 
  beta[1]   beta[2]   beta[4] 
 4.753804  1.069210 -2.263117 

The beta parameters for both GDP and EnergyUse per capita are positive, indicating a positive linear relationship with co2percap, which is confirmed by the plots.

For Lowcarbon_energy, the posterior mean of the beta parameter is negative, suggesting a negative linear relationship. This result is not immediately evident from the plot, as the data does not appear to follow a clear negative linear trend. However, the result is intuitively plausible: countries with a higher proportion of Lowcarbon_energy tend to produce less CO2.

Bayesian regressions

From now on we will continue our analysis by focusing on the covariates GDP, EnergyUse and Lowcarbon Energy.

GDP and CO2 Emissions

Next, we analyze the direct relationship between CO2 emissions and GDP.

We perform the regression on the log scale for better interpretability of the data.

The model is as follow:\[ \begin{split} & Y_i \sim \mathcal{N}(\alpha+ X_i \beta,\sigma^2) \\ & \alpha \sim \mathcal{N}(0,100) \\ & \beta \sim \mathcal{N}(0, 100)\\ & \frac{1}{\sigma^{2}} \sim \mathcal{G}(0.001,0.001) \\ \end{split} \]

# model
model1 <- textConnection("model{
  # likelihood
    for (i in 1:N) {
        Y[i] ~ dnorm(mu[i], inv.var)
        mu[i] = alpha + X[i] * beta
    }
    
    # prior 
    alpha ~ dnorm(0, .01)
    beta ~ dnorm(0, .01)
    inv.var ~ dgamma(0.001, 0.001)
    sigma2 <- 1/inv.var
}")


# Data
# Y = CO2_subset$co2percap
# X = CO2_subset$GDP
Y = log(CO2_subset$co2percap)         # log
X = log(CO2_subset$GDP)

dataList = list(Y=Y, X=X, N=length(Y))


# Jags 
samples1 <- jags(model.file = model1,
                     data=dataList,
                     # inits=inits,
                     parameters.to.save= c("alpha", "beta", "sigma2", "mu"),
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000,
                     n.thin = 2)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 359
   Unobserved stochastic nodes: 3
   Total graph size: 1445

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samples1
JAGS output for model '3', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 2,
yielding 18000 total samples from the joint posterior. 
MCMC ran for 0.022 minutes at time 2024-06-16 15:59:14.382353.

Successful convergence based on Rhat values (all < 1.1). 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 3 and DIC = 598.959 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(samples1$samples[,c('alpha')], main="posterior alpha")

plot(samples1$samples[,c('beta')], main="posterior beta")

plot(samples1$samples[,c('sigma2')], main="posterior sigma2")




# Autocorrelation
# autocorr.plot(samples1$samples[,c('alpha')], main="ACF alpha")
# autocorr.plot(samples$samples[,c('beta')], main="ACF beta")
# autocorr.plot(samples$samples[,c('sigma2')], main="ACF sigma2")
# Plotting the data by country
plot(X, Y,
     xlab = "GDP [1k$]", ylab = "CO2 per capita [tons]", 
     main = "CO2 per capita vs GDP (log scale)",
     pch = 20,
     cex = 1,
     col = "black",
     xaxt = 'n',  # suppress default x-axis
     yaxt = 'n'  # suppress default x-axis
     )

# Adding custom x-axis labels
new_labels_x <- c(10^1, 10^2, 10^3, 10^4)
axis(1, at = seq_along(new_labels_x), labels = new_labels_x)

# Adding custom y-axis labels
new_labels_y <- c(10^-1, 10^0, 10^1, 10^2, 10^3)
axis(2, at = seq_along(new_labels_y) - 2, labels = new_labels_y)



# Recovering alpha and beta
ss = summary(samples1)
# Alpha
alpha_mean = ss["alpha", "mean"]
alpha_q1 = ss["alpha", "2.5%"]
alpha_q2 = ss["alpha", "97.5%"]
# Beta
beta_mean = ss["beta", "mean"]
beta_q1 = ss["beta", "2.5%"]
beta_q2 = ss["beta", "97.5%"]

# Add a gray background
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = "gray90", border = NA)
panel.first = grid(col = "white", lty = "dotted")
points(X, Y, pch = 20, cex = 1, col = "black")

# Lines
abline(a = alpha_mean, b = beta_mean, col = "red", lwd = 3)
abline(a = alpha_q1, b = beta_q1, col = "red", lty=2, lwd = 3)
abline(a = alpha_q2, b = beta_q2, col = "red", lty=2, lwd = 3)

# legend
legend("topleft", legend=c("2.5%", "97.5%"), col=c("red", "red"), lty=3, lwd = 3,
       cex=0.8)

# ggplot version (ignorare)

# Load necessary library
library(ggplot2)

# Plot
g_bayes = ggplot(data=CO2_subset, aes(x=log(GDP), y=log(co2percap))) + 
  geom_point() +
  geom_abline(intercept = alpha_mean, slope = beta_mean, color = "red", 
              linewidth = 1) +
  geom_abline(intercept = alpha_q1, slope = beta_q1, color = "red",
              linetype = "dashed", linewidth = 1) +
  geom_abline(intercept = alpha_q2, slope = beta_q2, color = "red",
              linetype = "dashed", linewidth = 1) +
  scale_color_manual(name="Curves", values=c('blue','red')) +
  scale_fill_manual(name="Bands", values='blue')

# g_bayes
  

As we can see from the plot, there is a clear positive linear relationship between GDP and CO2 emissions per capita.

This finding aligns with the analysis performed on Dataset 1, explaining why economic recessions tend to reduce CO2 emission intensity, whereas periods of economic growth correspond with a more rapid increase in emissions.

Energy Use and CO2 Emissions

We also analyze the direct relationship between CO2 emissions and Energy Use.

Again, we perform the regression on the log scale for better interpretability.

The model is as follow:\[ \begin{split} & Y_i \sim \mathcal{N}(\alpha+ X_i \beta,\sigma^2) \\ & \alpha \sim \mathcal{N}(0,100) \\ & \beta \sim \mathcal{N}(0, 100)\\ & \frac{1}{\sigma^{2}} \sim \mathcal{G}(0.001,0.001) \\ \end{split} \]

# model
model2 <- textConnection("model{
  # likelihood
    for (i in 1:N) {
        Y[i] ~ dnorm(mu[i], inv.var)
        mu[i] = alpha + X[i] * beta
    }
    
    # prior 
    alpha ~ dnorm(0, .01)
    beta ~ dnorm(0, .01)
    inv.var ~ dgamma(0.001, 0.001)
    sigma2 <- 1/inv.var
}")


# Data
# Y = CO2_subset$co2percap
# X = CO2_subset$EnergyUse
Y = log(CO2_subset$co2percap)         # log
X = log(CO2_subset$EnergyUse)

dataList = list(Y=Y, X=X, N=length(Y))


# Jags 
samples2 <- jags(model.file = model2,
                     data=dataList,
                     # inits=inits,
                     parameters.to.save= c("alpha", "beta", "sigma2", "mu"),
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000,
                     n.thin = 2)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 359
   Unobserved stochastic nodes: 3
   Total graph size: 1445

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samples2
JAGS output for model '4', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 2,
yielding 18000 total samples from the joint posterior. 
MCMC ran for 0.023 minutes at time 2024-06-16 15:59:26.341013.

Successful convergence based on Rhat values (all < 1.1). 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 3 and DIC = 116.787 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(samples2$samples[,c('alpha')], main="posterior alpha")

plot(samples2$samples[,c('beta')], main="posterior beta")

plot(samples2$samples[,c('sigma2')], main="posterior sigma2")

# Plotting the data by country
plot(X, Y,
     xlab = "Energy Use [tons oil eq. per cap]", ylab = "CO2 per capita [tons]", 
     main = "CO2 per capita vs Energy Use (log scale)",
     pch = 20,
     cex = 1,
     col = "black",
     xaxt = 'n',  # suppress default x-axis
     yaxt = 'n'  # suppress default x-axis
     )

# # Adding custom x-axis labels
new_labels_x <- c(10^1, 10^2, 10^3, 10^4, 10^5)
axis(1, at = seq_along(new_labels_x), labels = new_labels_x)
# 
# # Adding custom y-axis labels
new_labels_y <- c(10^-1, 10^0, 10^1, 10^2, "1e3")
axis(2, at = seq_along(new_labels_y) - 2, labels = new_labels_y)



# Recovering alpha and beta
ss = summary(samples2)
# Alpha
alpha_mean = ss["alpha", "mean"]
alpha_q1 = ss["alpha", "2.5%"]
alpha_q2 = ss["alpha", "97.5%"]
# Beta
beta_mean = ss["beta", "mean"]
beta_q1 = ss["beta", "2.5%"]
beta_q2 = ss["beta", "97.5%"]

# Add a gray background
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = "gray90", border = NA)
panel.first = grid(col = "white", lty = "dotted")
points(X, Y, pch = 20, cex = 1, col = "black")

# Lines
abline(a = alpha_mean, b = beta_mean, col = "red", lwd = 3)
abline(a = alpha_q1, b = beta_q1, col = "red", lty=2, lwd = 3)
abline(a = alpha_q2, b = beta_q2, col = "red", lty=2, lwd = 3)

# legend
legend("topleft", legend=c("2.5%", "97.5%"), col=c("red", "red"), lty=3, lwd = 3,
       cex=0.8)

The analysis reveals a strong linear relationship between Energy Use and CO2 emissions per capita.

However, there are some data points that appear to be outliers. While these outliers are less evident in the log plot, they become more noticeable when plotted on the real scale.

# Plotting the data by country
plot(CO2$EnergyUse, CO2$co2percap, 
     xlab = "Energy Use [tons oil eq. per cap]", ylab = "CO2 per capita [tons]", 
     # log = "xy", 
     col = palette_colors[as.numeric(factor(CO2$country))]
     )

legend("topleft", legend="Each colour represents a country", cex=0.7)



# Selecting the outlier country
# Subset the data
selected_countries <- subset(CO2, co2percap < 20 & EnergyUse > 100)

# View the selected countries
countries = unique(selected_countries$country)

selected_countries
countries
[1] "Iceland"

Upon closer inspection, the only outlier is Iceland.

Iceland’s relatively low CO2 emissions can be attributed to its substantial use of low-carbon energy sources, which accounted for up to 80% of its energy production in 2009.

Low carbon Energy

Low-carbon energy is de fined as the sum of nuclear and renewable sources. Intuitively it is reasonable to expect to find a negative relation with the CO2 emissions.


# Exponential response
# model3 <- textConnection("model{
#   # likelihood
#   for (i in 1:N) {
#       # Y[i] ~ dnorm(mu[i], inv.s)
#       Y[i] ~ dexp(mu[i])
#       log(mu[i]) = alpha + X[i] * beta
#   }
# 
#   # prior
#   alpha ~ dnorm(0, .001)
#   beta ~ dnorm(0, .001)
#   inv.s ~ dgamma(0.001, 0.001)
# }")

# Normal model
model3 <- textConnection("model{
  # likelihood
    for (i in 1:N) {
        Y[i] ~ dnorm(mu[i], inv.var)
        # Y[i] ~ dexp(mu[i])
        mu[i] = alpha + X[i] * beta
    }

    # prior
    alpha ~ dnorm(0, .01)
    beta ~ dnorm(0, .01)
    inv.var ~ dgamma(0.001, 0.001)
    sigma2 <- 1/inv.var
}")


# Data
Y = CO2_subset$co2percap
X = CO2_subset$Lowcarbon_energy
# Y = log(CO2_subset$co2percap)         # log
# X = log(CO2_subset$Lowcarbon_energy)

dataList = list(Y=Y, X=X, N=length(Y))


# Jags 
samples3 <- jags(model.file = model3,
                     data=dataList,
                     # inits=inits,
                     parameters.to.save= c("alpha", "beta", "mu", "sigma2"),
                     n.adapt=1000, n.iter=20000, n.chains = 2, n.burnin = 2000,
                     n.thin = 2)

Processing function input....... 

Done. 
 
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 359
   Unobserved stochastic nodes: 3
   Total graph size: 1423

Initializing model

Adaptive phase, 1000 iterations x 2 chains 
If no progress bar appears JAGS has decided not to adapt 
 

 Burn-in phase, 2000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Sampling from joint posterior, 18000 iterations x 2 chains 
 

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Calculating statistics....... 

Done. 
# Output
samples3
JAGS output for model '5', generated by jagsUI.
Estimates based on 2 chains of 20000 iterations,
adaptation = 1000 iterations (sufficient),
burn-in = 2000 iterations and thin rate = 2,
yielding 18000 total samples from the joint posterior. 
MCMC ran for 0.024 minutes at time 2024-06-16 15:59:40.923708.

Successful convergence based on Rhat values (all < 1.1). 
Rhat is the potential scale reduction factor (at convergence, Rhat=1). 
For each parameter, n.eff is a crude measure of effective sample size. 

overlap0 checks if 0 falls in the parameter's 95% credible interval.
f is the proportion of the posterior with the same sign as the mean;
i.e., our confidence that the parameter is positive or negative.

DIC info: (pD = var(deviance)/2) 
pD = 3.1 and DIC = 2264.549 
DIC is an estimate of expected predictive error (lower is better).
# Trace and density
plot(samples3$samples[,c('alpha')], main="posterior alpha")

plot(samples3$samples[,c('beta')], main="posterior beta")

plot(samples3$samples[,c('sigma2')], main="posterior sigma2")

# Plotting the data by country
plot(X, Y,
     xlab = "Low Carbon Energy %", ylab = "CO2 per capita [tons]", 
     main = "CO2 per capita vs Low carbon energy",
     pch = 20,
     cex = 1,
     col = "black",
     # xaxt = 'n',  # suppress default x-axis
     # yaxt = 'n'  # suppress default x-axis
     )

# Adding custom x-axis labels
# new_labels_x <- c(10^1, 10^2, 10^3, 10^4, 10^5)
# axis(1, at = seq_along(new_labels_x), labels = new_labels_x)
# # 
# # # Adding custom y-axis labels
# new_labels_y <- c(10^-1, 10^0, 10^1, 10^2, "1e3")
# axis(2, at = seq_along(new_labels_y) - 2, labels = new_labels_y)




# Recovering alpha and beta
ss = summary(samples3)
# Alpha
alpha_mean = ss["alpha", "mean"]
alpha_q1 = ss["alpha", "2.5%"]
alpha_q2 = ss["alpha", "97.5%"]
# Beta
beta_mean = ss["beta", "mean"]
beta_q1 = ss["beta", "2.5%"]
beta_q2 = ss["beta", "97.5%"]




# Exponential  (use those plot with the exponential model)
# Y_pred = exp(alpha_mean + beta_mean*X)
# Y_q1 = exp(alpha_q1 + beta_q1*X)
# Y_q2 = exp(alpha_q2 + beta_q2*X)
# 
# 
# points(X, 1/Y_pred, col='red')
# points(X, 1/Y_q1, col='green')
# points(X, 1/Y_q2, col='green')




# Normal response

# Add a gray background
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = "gray90", border = NA)
panel.first = grid(col = "white", lty = "dotted")
points(X, Y, pch = 20, cex = 1, col = "black")

# Lines
abline(a = alpha_mean, b = beta_mean, col = "red", lwd = 3)
abline(a = alpha_q1, b = beta_q1, col = "red", lty=2, lwd = 3)
abline(a = alpha_q2, b = beta_q2, col = "red", lty=2, lwd = 3)

# legend
legend("topleft", legend=c("2.5%", "97.5%"), col=c("red", "red"), lty=3, lwd = 3,
       cex=0.8)

The model we choose doesn’t fit too well with the data, but a small negative trend is present and our hypothesis are verified.

#
#

Prossimi step:

LS0tDQp0aXRsZTogIlByb2plY3QgQ08yIC0gQmF5ZXNpYW4gU3RhdGlzdGljcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgQmF5ZXNpYW4gU3RhdGlzdGljYWwgQW5hbHlzaXMgb2YgQ08yIEVtaXNzaW9ucyBEYXRhDQoNCiMgUHJvamVjdCB0YXNrcyAodG8gZGVsZXRlKQ0KDQoxLiAgQ29uc2lkZXIgYSByZWdyZXNzaW9uIG1vZGVsIHRvIGV4cGxhaW4gQzAyIGVtaXNzaW9uIHdpdGggdGhlIG90aGVyIHZhcmlhYmxlcy4gWW91IGNhbiB0cmFuc2Zvcm0gc29tZSBvZiB0aGUgdmFyaWFibGVzLg0KDQoyLiAgQWRkaXRpb25hbCBxdWVzdGlvbnM6IEMwMiBhbmQgR0RQIGFyZSBzdHJvbmdseSBkZXBlbmRlbnQ/IEhpc3RvcmljYWxseSwgQ08yIGVtaXNzaW9ucyBoYXZlIGJlZW4gc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIGhvdyBtdWNoIG1vbmV5IHdlIGhhdmUuIFRoaXMgaXMgcGFydGljdWxhcmx5IHRydWUgYXQgbG93LXRvLW1pZGRsZSBpbmNvbWVzLiBUaGUgcmljaGVyIHdlIGFyZSwgdGhlIG1vcmUgQ08yIHdlIGVtaXQuIFRoaXMgaXMgYmVjYXVzZSB3ZSB1c2UgbW9yZSBlbmVyZ3kg4oCTIHdoaWNoIG9mdGVuIGNvbWVzIGZyb20gYnVybmluZyBmb3NzaWwgZnVlbHMuIFRoaXMgcmVsYXRpb25zaGlwIGlzIHN0aWxsIHRydWUgYXQgaGlnaGVyIGluY29tZXM/DQoNCjMuICBJbiBhZGRpdGlvbiB5b3UgY2FuOiBjb25zaWRlciBhbmQgY29tcGFyZSB2YXJpb3VzIHllYXJzLiBDb25zaWRlciB0aGUgdGltZSBhcyBhIGNvdmFyaWF0ZS4gQWRkIG1vcmUgY292YXJpYXRlcyAodGFraW5nIHRoZW0gZnJvbSB0aGUgd2ViKS4gQ29uc2lkZXIgdGltZSBzZXJpZXMgbW9kZWxzLg0KDQojIEludHJvZHVjdGlvbg0KDQpIdW1hbiBlbWlzc2lvbnMgb2YgY2FyYm9uIGRpb3hpZGUgYW5kIG90aGVyIGdyZWVuaG91c2UgZ2FzZXMgYXJlIGEgcHJpbWFyeSBkcml2ZXIgb2YgY2xpbWF0ZSBjaGFuZ2UgYW5kIHByZXNlbnQgb25lIG9mIHRoZSB3b3JsZCdzIG1vc3QgcHJlc3NpbmcgY2hhbGxlbmdlcy4NCg0KVG8gdW5kZXJzdGFuZCB0aGlzIGNvbXBsZXggaXNzdWUgYmV0dGVyIG91ciBhbmFseXNpcyB3aWxsIGZvY3VzIG9uOg0KDQoxLiAgKipMb25nLVRlcm0gVHJlbmRzKio6IHdlIHdpbGwgZXhhbWluZSBob3cgQ08yIGVtaXNzaW9ucyBoYXZlIGV2b2x2ZWQgb3ZlciB0aGUgcGFzdCBjZW50dXJ5LCBpZGVudGlmeWluZyBrZXkgcGVyaW9kcyBvZiBpbmNyZWFzZSBvciBkZWNyZWFzZSBpbiB0aGUgc3BlZWQgb2YgZW1pc3Npb25zIGFuZCBjb3JyZWxhdGluZyB0aGVzZSB3aXRoIGhpc3RvcmljYWwgZXZlbnRzLg0KDQoyLiAgKipSZWNlbnQgRmFjdG9ycyBJbmZsdWVuY2luZyBDTzIgRW1pc3Npb25zKio6IHdlIHdpbGwgYW5hbHl6ZSB0aGUgaW1wYWN0IG9mIHZhcmlvdXMgZmFjdG9ycyBvbiBDTzIgZW1pc3Npb25zIGZyb20gMjAwNiB0byAyMDA5LiBUaGlzIGluY2x1ZGVzIGludmVzdGlnYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIENPMiBlbWlzc2lvbnMgYW5kIHZhcmlhYmxlcyBzdWNoIGFzIGVuZXJneSBjb25zdW1wdGlvbiwgR0RQLCBhbmQgdGhlIGFkb3B0aW9uIG9mIGxvdy1jYXJib24gZW5lcmd5IHNvdXJjZXMuDQoNCjMuICAqKkNvbXBhcmF0aXZlIEFuYWx5c2lzKio6IFdlIHdpbGwgY29tcGFyZSBmaW5kaW5ncyBmcm9tIGJvdGggZGF0YXNldHMgdG8gdW5kZXJzdGFuZCBob3cgaGlzdG9yaWNhbCB0cmVuZHMgcmVsYXRlIHRvIG1vcmUgcmVjZW50IGRldmVsb3BtZW50cy4NCg0KIyBEYXRhc2V0cw0KDQpCcmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YXNldHM6DQoNCi0gICAqKkRhdGFzZXQgMSoqIGVuY29tcGFzc2VzIGFubnVhbCBDTzIgZW1pc3Npb25zIGZvciBlYWNoIHllYXIgZnJvbSAxOTAwIHRvIDIwMjIuIFRoaXMgZGF0YXNldCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgcGVyc3BlY3RpdmUgb24gQ08yIGVtaXNzaW9ucyBvdmVyIG1vcmUgdGhhbiBhIGNlbnR1cnksIGFsbG93aW5nIHVzIHRvIGlkZW50aWZ5IGxvbmctdGVybSB0cmVuZHMgYW5kIHBhdHRlcm5zLg0KDQotICAgKipEYXRhc2V0IDIqKiBpcyBtb3JlIGdyYW51bGFyIGFuZCBjb25jZW50cmF0ZXMgb24gdGhlIHllYXJzIDIwMDYgdG8gMjAwOS4gSXQgaW5jbHVkZXMgdmFyaW91cyBmZWF0dXJlcyBzdWNoIGFzIGVuZXJneSB1c2UgcGVyIGNhcGl0YSwgR0RQLCBwb3B1bGF0aW9uLCBDTzIgZW1pc3Npb25zIHBlciBjYXBpdGEsIHRoZSBwZXJjZW50YWdlIG9mIGxvdy1jYXJib24gZW5lcmd5IGluIHRvdGFsIGVuZXJneSBwcm9kdWN0aW9uLCB1cmJhbml6YXRpb24gbGV2ZWxzLCBhbmQgaW50ZXJuZXQgdXNhZ2UuIFRoaXMgZGF0YXNldCBhbGxvd3MgZm9yIGEgZGV0YWlsZWQgYW5hbHlzaXMgb2Ygc3BlY2lmaWMgZmFjdG9ycyB0aGF0IG1heSBpbmZsdWVuY2UgQ08yIGVtaXNzaW9ucyBkdXJpbmcgYSByZWNlbnQsIGZvY3VzZWQgdGltZWZyYW1lLg0KDQpCeSBpbnRlZ3JhdGluZyB0aGVzZSB0d28gZGF0YXNldHMsIHdlIGFpbSB0byBhbmFseXNlIENPMiBlbWlzc2lvbnMgb3ZlciB0aW1lIGFuZCBpZGVudGlmeSB0aGUgZmFjdG9ycyBkcml2aW5nIGNoYW5nZXMgaW4gcmVjZW50IHllYXJzLg0KDQojIERhdGFzZXQgMQ0KDQpXZSBiZWdpbiBvdXIgYW5hbHlzaXMgYnkgY29uc2lkZXJpbmcgdGhlIGxvbmctdGVybSB0cmVuZHMgaW4gYW5udWFsIENPMiBlbWlzc2lvbnMgb3ZlciB0aGUgbGFzdCBjZW50dXJ5Lg0KDQoqKlNvdXJjZXM6KioNCg0KPGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnL2dyYXBoZXIvYW5udWFsLWNvMi1lbWlzc2lvbnMtcGVyLWNvdW50cnk+DQoNCioqU2hvcnQgZGVzY3JpcHRpb246KioNCg0KSHVtYW4gZW1pc3Npb25zIG9mIGNhcmJvbiBkaW94aWRlIGFuZCBvdGhlciBncmVlbmhvdXNlIGdhc2VzIGJldHdlZW4gMTkwMCBhbmQgMjAyMi4NCg0KSXQgaW5jbHVkZXMgZGF0YSBmb3IgdmFyaW91cyBuYXRpb25zLCBlbmNvbXBhc3NpbmcgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6DQoNCi0gICAqKmNvdW50cnkqKjogbmFtZSBvZiB0aGUgY291bnRyeS4NCi0gICAqKkNvZGUqKjogdGhlIGNvZGUgb2YgZWFjaCBjb3VudHJ5DQotICAgKipZZWFyKio6IHllYXIuDQotICAgKipBbm51YWxDTzIqKjogQW5udWFsIENPMiBlbWlzc2lvbnMuIFtiaWxsaW9uIHRvbnNdIChyZXNjYWxlZCBmcm9tIHRvbnMpDQoNCmBgYHtyfQ0KIyBMb2FkaW5nIHRoZSBkYXRhDQpDTzJfZnVsbCA8LSByZWFkLmNzdigiRGF0YS9hbm51YWwtY28yLWVtaXNzaW9ucy1wZXItY291bnRyeS5jc3YiKQ0KQ08yX2Z1bGwkQW5udWFsQ08yID0gQ08yX2Z1bGwkQW5udWFsQ08yIC8xMF45DQpoZWFkKENPMl9mdWxsKQ0KDQoNCiMgV2UgZmlsdGVyIHRoZSBkYXRhc2V0IGZvciB0aGUgd29ybGQgZGF0YSBhZnRlciAxOTAwDQp3b3JsZF9kYXRhIDwtIENPMl9mdWxsW0NPMl9mdWxsJGNvdW50cnkgPT0gJ1dvcmxkJyAmIENPMl9mdWxsJFllYXIgPiAxOTAwLF0NCg0KIyBQbG90DQpwbG90KHdvcmxkX2RhdGEkWWVhciwgd29ybGRfZGF0YSRBbm51YWxDTzIsIHR5cGU9J2wnLCBjb2w9J2RhcmtncmVlbicsIHlsYWI9IkFubnVhbCBDTzIgKGJpbGxpb24gdCkiLCBtYWluPSJDTzIgRW1pc3Npb25zIGZvciB0aGUgV29ybGQiLCB4bGFiPSJZZWFyIikNCnBvaW50cyh3b3JsZF9kYXRhJFllYXIsIHdvcmxkX2RhdGEkQW5udWFsQ08yLCBjb2w9J2RhcmtncmVlbicsIHBjaD0xNiwgY2V4PTAuNSkNCmBgYA0KDQpUaGUgZGF0YSBwcmVzZW50cyBhIGNsZWFyIGV4cG9uZW50aWFsIHRyZW5kLCBmb3IgdGhpcyByZWFzb24gaXQgY291bGQgYmUgaW50ZXJlc3RpbmcgdG8gYW5hbHlzZSB0aGUgKipsb2dhcml0aG0qKiBvZiB0aGUgZGF0YSBhbmQgc2VlIGlmIHdlIGNhbiBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgdHJlbmRzLg0KDQpXZSB3aWxsIHRyYW5zZm9ybSB0aGUgQ08yIGluIGxvZ19DTzIgYW5kIGFsc28gY29tcHV0ZSB0aGUgKippbmNyZW1lbnQgaW4gbG9nX0NPMioqIGkuZSAkJA0KeF90IDo9XGxvZyh5X3t0KzF9KS1cbG9nKHlfdCkNCiQkDQoNCmBgYHtyfQ0KIyBDcmVhdGluZyB0aGUgZGF0YQ0KQ08yX2xvZyA9IGxvZyh3b3JsZF9kYXRhJEFubnVhbENPMiwgMTApDQpuMSA9IGxlbmd0aChDTzJfbG9nKQ0KDQpkZWx0YV9sb2dkYXRhID0gQ08yX2xvZ1syOm4xXSAtIENPMl9sb2dbMTpuMS0xXQ0KbjIgPSBsZW5ndGgoZGVsdGFfbG9nZGF0YSkNCg0KIyBZZWFycyANCnllYXIgPSB3b3JsZF9kYXRhJFllYXINCg0KDQojIFBsb3RzDQojIExvZyBkYXRhDQpwbG90KHllYXIsIENPMl9sb2csIHR5cGU9J2wnLCBjb2w9J2RhcmtncmVlbicsIHlsYWI9ImxvZyhBbm51YWwgQ08yKSIsIG1haW49ImxvZyhDTzIpIiwgeGxhYj0iWWVhciIpDQpwb2ludHMoeWVhciwgQ08yX2xvZywgY29sPSdkYXJrZ3JlZW4nLCBwY2g9MTYsIGNleD0wLjUpDQoNCiMgRGVsdGEgbG9nIGRhdGENCnBsb3QoeWVhclsxOmxlbmd0aChkZWx0YV9sb2dkYXRhKV0sIGRlbHRhX2xvZ2RhdGEsIHR5cGU9J2wnLCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgbWFpbj0iRGVsdGEgbG9nLWNvMiIsIHhsYWI9IlllYXIiKQ0KYGBgDQoNCiMjIENoYW5nZSBwb2ludCBtb2RlbCBmb3IgdGhlIHZhcmlhbmNlDQoNCkZyb20gdGhlIGRlbHRhIGxvZy1DTzIgaXQgaXMgY2xlYXIgZnJvbSB0aGUgZGF0YSB0aGF0IHNvbWUga2luZCBvZiAqKnNoaWZ0IG9uIHRoZSB2YXJpYW5jZSoqIGlzIGhhcHBlbmluZy4NCg0KVG8gYW5hbHlzZSB0aGlzIGluIG1vcmUgZGV0YWlsIHdlIHdpbGwgZml0IGEgY2hhbmdlIHBvaW50IG1vZGVsIG9uIHRoZSB2YXJpYW5jZSB0byBvdXIgZGF0YS4NCg0KV2UgYXNzdW1lIGZvciBvdXIgZGF0YSBhIEdhdXNzaWFuIGxpa2VsaWhvb2Q6JCQNCnlfdCBcc2ltIFxtYXRoY2Fse059KFxtdV8wLFxzaWdtYV90XjIpLg0KJCRBbiBldmVudCBvY2N1cnMgYXQgYSByYW5kb20gdW5vYnNlcnZlZCB0aW1lICRcdGF1JCwgdGhlIHNvLWNhbGxlZCAiY2hhbmdlIHBvaW50Ii5cDQpUaGlzIGlzIHJlZmxlY3RlZCBpbiB0aGUgYXNzdW1wdGlvbiAkJA0KXHNpZ21hX3ReMiA9XHNpZ21hX3sxfV4yIFxxdWFkIHQgPCBcdGF1DQokJCBhbmQgJCQNClxzaWdtYV90XjIgPVxzaWdtYV97Mn1eMiBccXVhZCB0IFxnZXEgXHRhdQ0KJCQgd2hlcmUgJFxzaWdtYV8xXjIsIFxzaWdtYV8yXjIkIGFyZSB1bmtub3duLg0KDQpUaGUgbW9kZWwgaXMgYXMgZm9sbG93czogJCQNClxiZWdpbntzcGxpdH0NCiYgeV90IFxzaW0gXG1hdGhjYWx7Tn0oXG11XzAsXHNpZ21hX3ReMilcXA0KJiBcc2lnbWFfdF4yID0gXHNpZ21hX3sxfV4yIFx7dCA8IFx0YXUgXH0gKyBcc2lnbWFfMl4yIFx7IHQgXGdlcSBcdGF1XH0gXFwNCiYgXHRhdSBcc2ltIFxtYXRoY2Fse1V9KDAsTSkgXFwNCiYgXG11XzAgXHNpbSBcbWF0aGNhbHtOfSgwLDEwMCkgXFwNCiYgXGZyYWN7MX17XHNpZ21hX2leMn0gIFxzaW0gXG1hdGhjYWx7R30oMC4wMDEsIDAuMDAxKSAgXCAgJmkgXGluIFsxLCAyXQ0KXGVuZHtzcGxpdH0NCiQkICRNJCBpcyBhIHBhcmFtZXRlciB0aGF0IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGRhdGFwb2ludHMuDQoNCldlIGNob29zZSB0aGUgcHJpb3JzIGZvciAkXG11XzAkIGFuZCAkXGZyYWN7MX17XHNpZ21hX2leMn0kIHRvIGJlIHdlYWtseSBpbmZvcm1hdGl2ZS4NCg0KYGBge3J9DQpsaWJyYXJ5KHJqYWdzKQ0KbGlicmFyeShiYXllc3Bsb3QpDQpsaWJyYXJ5KGphZ3NVSSkNCmxpYnJhcnkobG9vKQ0KDQojIGNoYW5nZS1wb2ludCBtb2RlbA0KbW9kZWxDaGFuZ2VQb2ludCA8LQ0KIm1vZGVsew0KICAjIExpa2VsaWhvb2QNCiAgZm9yKGkgaW4gMTpuKXsNCiAgICB4W2ldIH4gZG5vcm0obXUsIHNpbnZfQ1BbaV0pDQogICAgc2ludl9DUFtpXSA8LSBzaW52W0pbaV1dIA0KICAgIEpbaV0gPC0gZFtpXSArIDEgICAgICAgICAjIG1vdmUgdG8gKDAsMSkgaW4gKDEsMikNCg0KICB9DQogIA0KICAjIE1lYW4gY2hhbmdlDQogIGZvcih0IGluIDE6bil7DQogICAgZFt0XSA8LSBzdGVwKFRhdSAtIHQpICAgDQogICAgICAgICAgICAgICMgMCBpZiAoYWd1bWVudCA8IDApLCAxIG90aGVyd2lzZSAgDQogICAgICAgICAgICAgICMgUHJvYmFiaWxpdGllcyBvZiB0aGUgY2hhbmdpbmcgcG9pbnQgdG8gaGF2ZSBoYXBwZW5lZA0KICB9DQogIA0KICAjIFByaW9yIGZvciBkW2ldDQogIFRhdSB+IGR1bmlmKDEsIG4rMTApDQogIA0KICAjIFByaW9yIGZvciBiZXRhDQogIG11IH4gZG5vcm0oMCwgMC4wMSkgDQogIHNpbnZbMV0gfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKSAgICMgTm9uIGluZm9ybWF0aXZlDQogIHNpbnZbMl0gfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKQ0KICAjIHNpbnZbMV0gfiAgZHVuaWYoMCwgMTAwMDAwKSAgICMgTm9uIGluZm9ybWF0aXZlDQogICMgc2ludlsyXSB+ICBkdW5pZigwLCAxMDAwMDApDQogIA0KfSINCg0KDQoNCiMgRGF0YQ0KbXlEYXRhID0gbGlzdCh4PWRlbHRhX2xvZ2RhdGEsIG49bGVuZ3RoKGRlbHRhX2xvZ2RhdGEpKSANCg0KIyBKYWdzDQpvdXRwdXRtY21jQ1AgPC0gamFncyhtb2RlbC5maWxlPXRleHRDb25uZWN0aW9uKG1vZGVsQ2hhbmdlUG9pbnQpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG15RGF0YSwNCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudG8uc2F2ZSA9IGMoIm11IiwgInNpbnZfQ1AiLCAiVGF1IiwiSiIpLCANCiAgICAgICAgICAgICAgICAgICAgIG4uYWRhcHQ9MTAwMCwgbi5pdGVyPTIwMDAwLCBuLmNoYWlucyA9IDIsIG4uYnVybmluID0gMjAwMCkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBPdXRwdXQNCm91dHB1dG1jbWNDUA0KYGBgDQoNCmBgYHtyfQ0KIyBUcmFjZSBhbmQgZGVuc2l0eQ0KcGxvdChvdXRwdXRtY21jQ1Akc2FtcGxlc1ssYygic2ludl9DUFsxMF0iKV0sIG1haW49InBvc3RlcmlvciBzaW52X0NQWzEwXSIpDQpwbG90KG91dHB1dG1jbWNDUCRzYW1wbGVzWyxjKCJzaW52X0NQWzkwXSIpXSwgbWFpbj0icG9zdGVyaW9yIHNpbnZfQ1BbOTBdIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBBdXRvY29ycmVsYXRpb24gZnVuY3Rpb246DQphdXRvY29yci5wbG90KG91dHB1dG1jbWNDUCRzYW1wbGVzWyxjKCJzaW52X0NQWzEwXSIpXSwgbWFpbj0gInNpbnZfQ1BbMTBdIEFDRiIpDQphdXRvY29yci5wbG90KG91dHB1dG1jbWNDUCRzYW1wbGVzWyxjKCJzaW52X0NQWzkwXSIpXSwgbWFpbj0gInNpbnZfQ1BbOTBdIEFDRiIpDQpgYGANCg0KYGBge3J9DQoNCiMgU2VsZWN0aW5nIHRoZSB0YXVzDQp0YXVfc2FtcGxlcyA9IG91dHB1dG1jbWNDUCRzYW1wbGVzW1sxXV1bLCAiVGF1Il0NCg0KIyBDYWxjdWxhdGUgdGhlIG1lYW4NCnRtZWFuIDwtIG1lYW4odGF1X3NhbXBsZXMpDQoNCiMgQ2FsY3VsYXRlIHRoZSAyLjUlIHF1YW50aWxlDQpxMSA8LSBxdWFudGlsZSh0YXVfc2FtcGxlcywgcHJvYnMgPSAwLjA1KQ0KDQojIENhbGN1bGF0ZSB0aGUgOTcuNSUgcXVhbnRpbGUNCnEyIDwtIHF1YW50aWxlKHRhdV9zYW1wbGVzLCBwcm9icyA9IDAuOTUpDQoNCg0KIyBGaW5kaW5nIHRoZSB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gcWkNCnllYXJfcTEgPSB5ZWFyW2Zsb29yKHExKV0NCnllYXJfcTIgPSB5ZWFyW2Zsb29yKHEyKV0NCnllYXJfdG1lYW4gPSB5ZWFyW2Zsb29yKHRtZWFuKV0NCg0KDQoNCiMgUGxvdCANCnBsb3QoeWVhclsxOmxlbmd0aChkZWx0YV9sb2dkYXRhKV0sIGRlbHRhX2xvZ2RhdGEsIHR5cGU9J2wnLCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgbWFpbj0iRGVsdGEgbG9nLWNvMiIsIHhsYWI9IlllYXIiKQ0KDQojIGxpbmVzIGZvciB0aGUgY2hhbmdlIHBvaW50DQphYmxpbmUodj15ZWFyX3RtZWFuLCBjb2w9InJlZCIsIGx3ZD0xLjUpDQphYmxpbmUodj15ZWFyX3ExLCBjb2w9InJlZCIsIGx3ZD0xLjUsIGx0eSA9IDMpDQphYmxpbmUodj15ZWFyX3EyLCBjb2w9InJlZCIsIGx3ZD0xLjUsIGx0eSA9IDMpDQoNCg0KDQojIENyZWF0ZSBhIGRhdGEgZnJhbWUgdG8gcHJpbnQgdGhlIHllYXJzDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBxMSA9IHllYXJfcTEsDQogIE1lYW4gPSB5ZWFyX3RtZWFuLA0KICBxMiA9IHllYXJfcTINCikNCmNvbG5hbWVzKGRmKSA8LSBjKCI1JSIsICJNZWFuIiwgIjk1JSIpDQoNCg0KIyBQcmludCB0aGUgZGF0YSBmcmFtZQ0KcHJpbnQoZGYpDQpgYGANCg0KKipPdXIgYW5hbHlzaXMgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgc2hpZnQgaW4gdGhlIHZhcmlhbmNlIG9mIHRoZSBlbWlzc2lvbiBhcm91bmQgMTk1MS4gV2l0aCA5MCUgY29uZmlkZW5jZSwgd2UgY2FuIHNheSB0aGlzIHNoaWZ0IGxpa2VseSBvY2N1cnJlZCBiZXR3ZWVuIDE5NDkgYW5kIDE5NTYuKiogVGhpcyB0aW1lZnJhbWUgaXMgcGFydGljdWxhcmx5IGludGVyZXN0aW5nIGJlY2F1c2UgaXQgY29pbmNpZGVzIHdpdGggc2V2ZXJhbCBtYWpvciBldmVudHMgdGhhdCBjb3VsZCBiZSBsaW5rZWQgdG8gdGhpcyBjaGFuZ2UgaW4gdHJlbmQ6DQoNCi0gICAqKlRoZSBNYXJzaGFsbCBQbGFuICgxOTQ4KToqKiBUaGlzIGxhcmdlLXNjYWxlIFUuUy4gcHJvZ3JhbSBhaW1lZCB0byByZWJ1aWxkIEV1cm9wZSBhZnRlciBXb3JsZCBXYXIgSUkuIEl0IGxpa2VseSBzcHVycmVkIGVjb25vbWljIGFjdGl2aXR5IGFuZCBwb3RlbnRpYWxseSBpbmNyZWFzZWQgQ08yIGVtaXNzaW9ucy4NCg0KLSAgICoqVGhlIFBvc3QtV2FyIEVjb25vbWljIEJvb20gKDE5NDUtMTk3Myk6KiogVGhpcyBwZXJpb2Qgb2YgcmFwaWQgZWNvbm9taWMgZ3Jvd3RoIGFjcm9zcyB0aGUgZ2xvYmUgY291bGQgaGF2ZSBzaWduaWZpY2FudGx5IGNvbnRyaWJ1dGVkIHRvIHJpc2luZyBlbWlzc2lvbnMuDQoNCk9uZSBwb3NzaWJsZSBpbnRlcnByZXRhdGlvbiBvZiB0aGVzZSBmaW5kaW5ncyBpcyB0aGF0IGltcHJvdmVkIGVjb25vbWljIGNvbmRpdGlvbnMgbGVkIHRvICoqYm90aCBhIGRlY3JlYXNlIGluIHRoZSB2YXJpYWJpbGl0eSBhbmQgYW4gaW5jcmVhc2UgaW4gdGhlIG92ZXJhbGwgcXVhbnRpdHkgb2YgZW1pc3Npb25zKiouIFRoaXMgc3VnZ2VzdHMgYSBzaGlmdCB0b3dhcmRzIG1vcmUgY29uc2lzdGVudCwgYnV0IGhpZ2hlciwgZW1pc3Npb25zIGR1cmluZyB0aGlzIHRpbWUuDQoNCioqQ3JlZGlibGUgSW50ZXJ2YWw6KiogV2hlbiB5b3Ugc3BlY2lmeSBhIHJhbmdlIGJldHdlZW4gdGhlIDV0aCBwZXJjZW50aWxlIGFuZCB0aGUgOTV0aCBwZXJjZW50aWxlIG9mIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uLCB5b3UgYXJlIGRlc2NyaWJpbmcgYSA5MCUgY3JlZGlibGUgaW50ZXJ2YWwuIEEgY3JlZGlibGUgaW50ZXJ2YWwgZ2l2ZXMgYSByYW5nZSB3aXRoaW4gd2hpY2ggdGhlIHRydWUgcGFyYW1ldGVyIGlzIGJlbGlldmVkIHRvIGxpZSB3aXRoIGEgY2VydGFpbiBwcm9iYWJpbGl0eSwgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uLg0KDQojIyBDaGFuZ2UgUG9pbnQgbW9kZWwgZm9yIHRoZSBtZWFuDQoNCioqR2l2ZW4gdGhlIHBvdGVudGlhbCBzaGlmdCBpbiBDTzIgZW1pc3Npb24gcGF0dGVybnMgYXJvdW5kIDE5NTEsIGEgbmV4dCBzdGVwIGNvdWxkIGJlIHRvIGludmVzdGlnYXRlIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGNoYW5nZXMgaW4gdHJlbmQgZm9sbG93aW5nIHRoaXMgcGVyaW9kLioqIFRoZSBQb3N0LVdhciBFY29ub21pYyBCb29tIGVuZGVkIHdpdGggYSByZWNlc3Npb24gKDE5NzMtMTk3NSksIGZvbGxvd2VkIGJ5IGFuIGV2ZW4gZGVlcGVyIG9uZSBpbiB0aGUgZWFybHkgMTk4MHMuIFRoaXMgaGlzdG9yaWNhbCBjb250ZXh0IHByb21wdHMgdGhlIHF1ZXN0aW9uOiAqKkNhbiB3ZSBkZXRlY3QgYW5vdGhlciBjaGFuZ2UgcG9pbnQgaW4gdGhlIENPMiBlbWlzc2lvbnMgZGF0YSBhZnRlciAxOTUxPyoqDQoNCkZvciB0aGUgbmV4dCBhbmFseXNpcyB3ZSB3aWxsIHRyeSB0byBmaXQgdGhlIGRhdGEgYWZ0ZXIgdGhlIGZpcnN0IHNoaWZ0ICgxOTUxKSB3aXRoIGEgY2hhbmdlIHBvaW50IG1vZGVsIG9uIHRoZSBtZWFuIG9mIHRoZSBkZWx0YSBsb2ctY28yIGluIHRoZSB5ZWFycyBhZnRlciAxOTU2ICg5NSUgcXVhbnRpbGUgb2YgdGhlIGNoYW5nZSBwb2ludCBvbiB0aGUgdmFyaWFuY2UpLiBUaGlzIG1lYW5zIHRoYXQgd2Ugd2lsbCBhbmFseXNlIHRoZSBjaGFuZ2UgaW4gc3BlZWQgb2YgdGhlIGluY3JlYXNlIG9mIENPMiAobWVhbiBvZiB0aGUgbG9nYXJpdGhtKSBhbmQgbm90IGl0cyB2YXJpYW5jZSBhbnltb3JlLg0KDQpUaGUgbW9kZWwgaXMgYXMgZm9sbG93czokJA0KXGJlZ2lue3NwbGl0fQ0KJiB5X3QgIFxzdGFja3JlbHtpbmR9e1xzaW19IFxtYXRoY2Fse059KFxtdV90LFxzaWdtYV97MH1eMilcXA0KJiBcbXVfdD1cbXVfMSBce3QgPCBcdGF1IFx9ICsgXG11XzIgXHsgdCBcZ2VxIFx0YXVcfSBcXA0KJiBcdGF1IFxzaW0gXG1hdGhjYWx7VX0oMCxNKSBcXA0KJiBcbXVfMSBcc2ltIFxtYXRoY2Fse059KDUsMTAwKSBcXA0KJiBcbXVfMiBcc2ltIFxtYXRoY2Fse059KDAsMTAwKSBcXA0KJiBcZnJhY3sxfXtcc2lnbWFeMn0gXHNpbSBcbWF0aGNhbHtVfSgwLCAxMDAwMDApDQpcZW5ke3NwbGl0fQ0KJCQkTSQgaXMgYSBwYXJhbWV0ZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBkYXRhcG9pbnRzLg0KDQpXZSBjaG9vc2UgdGhlIHByaW9ycyBmb3IgJFxtdV8wJCBhbmQgJFxmcmFjezF9e1xzaWdtYV4yfSQgdG8gYmUgd2Vha2x5IGluZm9ybWF0aXZlLg0KDQpgYGB7cn0NCiMgRmlsdGVyaW5nIGZvciBkYXRhIGFmdGVyIHRoZSBjaGFuZ2UgcG9pbnQNCiMgISEhIFRoZSBkYXRhIGlzIGFmdGVyIDE5NTYgKGV2ZW4gaWYgdGhlIHZhcmlhYmxlIGhhcyBhIDUxIGluIHRoZSBuYW1lKQ0Kd29ybGRfZGF0YV9hZnRlcjE5NTEgPC0gd29ybGRfZGF0YVt3b3JsZF9kYXRhJFllYXIgPiAxOTU2LF0NCiAgICAgICAgICANCg0KIyBDcmVhdGluZyB0aGUgZGF0YQ0KQ08yX2xvZ181MSA9IGxvZyh3b3JsZF9kYXRhX2FmdGVyMTk1MSRBbm51YWxDTzIsIDEwKQ0KbjEgPSBsZW5ndGgoQ08yX2xvZ181MSkNCg0KZGVsdGFfbG9nZGF0YV81MSA9IENPMl9sb2dfNTFbMjpuMV0gLSBDTzJfbG9nXzUxWzE6bjEtMV0NCm4yID0gbGVuZ3RoKGRlbHRhX2xvZ2RhdGEpDQoNCiMgWWVhcnMgDQp5ZWFyID0gd29ybGRfZGF0YV9hZnRlcjE5NTEkWWVhcg0KDQoNCiMgUGxvdHMNCnBsb3QoeWVhciwgQ08yX2xvZ181MSwgdHlwZT0nbCcsIGNvbD0nZGFya2dyZWVuJywgeWxhYj0ibG9nKEFubnVhbCBDTzIpIiwgbWFpbj0ibG9nKENPMikiLCB4bGFiPSJZZWFyIikNCnBvaW50cyh5ZWFyLCBDTzJfbG9nXzUxLCBjb2w9J2RhcmtncmVlbicsIHBjaD0xNiwgY2V4PTAuNSkNCg0KIyBEZWx0YSBsb2cgZGF0YQ0KcGxvdCh5ZWFyWzE6bGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNTEpXSwgZGVsdGFfbG9nZGF0YV81MSwgdHlwZT0nbCcsIHlsYWI9IkRlbHRhIGxvZy1jbzIiLCBtYWluPSJEZWx0YSBsb2ctY28yIiwgeGxhYj0iWWVhciIpDQpgYGANCg0KYGBge3J9DQojIGNoYW5nZS1wb2ludCBtb2RlbA0KbW9kZWxDaGFuZ2VQb2ludF9tZWFuIDwtDQoibW9kZWx7DQogICMgTGlrZWxpaG9vZA0KICBmb3IoaSBpbiAxOm4pew0KICAgIHhbaV0gfiBkbm9ybShtdVtpXSwgc2ludikNCiAgICBtdVtpXSA8LSBtW0pbaV1dIA0KICAgIEpbaV0gPC0gZFtpXSArIDEgICAgICAgICAjIG1vdmUgdG8gKDAsMSkgaW4gKDEsMikNCiAgfQ0KICANCiAgIyBNZWFuIGNoYW5nZQ0KICBmb3IodCBpbiAxOm4pew0KICAgIGRbdF0gPC0gc3RlcChUYXUgLSB0KSAgICMgcHJvYmFiaWxpdGllcyBvZiB0aGUgY2hhbmdpbmcgcG9pbnQgdG8gaGF2ZSBoYXBwZW5lZA0KICB9DQogIA0KICAjIFByaW9yIGZvciBkW2ldDQogIFRhdSB+IGR1bmlmKDEsIG4rMTApDQogIA0KICAjIFByaW9yIGZvciBiZXRhDQogIG1bMV0gfiBkbm9ybSg1LCAwLjAxKQ0KICBtWzJdIH4gZG5vcm0oMCwgMC4wMSkNCiAgc2ludiB+IGR1bmlmKDAsIDEwMDAwMCkgICAgICAgICAjIFRoaXMgaXMgbW9yZSBzdGFibGUgdGhhdCBhIEdhbW1hDQogIA0KfSINCg0KDQojIERhdGENCm15RGF0YSA9IGxpc3QoeD1kZWx0YV9sb2dkYXRhXzUxLCBuPWxlbmd0aChkZWx0YV9sb2dkYXRhXzUxKSkgDQoNCiMgSmFncw0Kb3V0cHV0bWNtY0NQIDwtIGphZ3MobW9kZWwuZmlsZT10ZXh0Q29ubmVjdGlvbihtb2RlbENoYW5nZVBvaW50X21lYW4pLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG15RGF0YSwNCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudG8uc2F2ZSA9IGMoIm11IiwgInNpbnYiLCAiVGF1IiwiSiIpLCANCiAgICAgICAgICAgICAgICAgICAgIG4uYWRhcHQ9MTAwMCwgbi5pdGVyPTIwMDAwLCBuLmNoYWlucyA9IDIsIG4uYnVybmluID0gMjAwMCwgDQogICAgICAgICAgICAgICAgICAgICBuLnRoaW4gPSAxKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiMgT3V0cHV0DQpvdXRwdXRtY21jQ1ANCg0KIyBUcmFjZSBhbmQgZGVuc2l0eQ0KcGxvdChvdXRwdXRtY21jQ1Akc2FtcGxlc1ssYygic2ludiIpXSwgbWFpbj0icG9zdGVyaW9yIHNpbnYiKQ0KcGxvdChvdXRwdXRtY21jQ1Akc2FtcGxlc1ssYygibXVbNV0iKV0sIG1haW49InBvc3RlcmlvciBtdVs1XSIpDQpwbG90KG91dHB1dG1jbWNDUCRzYW1wbGVzWyxjKCJtdVs1MF0iKV0sIG1haW49InBvc3RlcmlvciBtdVs1MF0iKQ0KDQojIEF1dG9jb3JyZWxhdGlvbg0KYXV0b2NvcnIucGxvdChvdXRwdXRtY21jQ1Akc2FtcGxlc1ssYygic2ludiIpXSwgbWFpbj0gInNpbnYgQUNGIikNCmF1dG9jb3JyLnBsb3Qob3V0cHV0bWNtY0NQJHNhbXBsZXNbLGMoIm11WzVdIildLCBtYWluPSJtdVs1XSBBQ0YiKQ0KYXV0b2NvcnIucGxvdChvdXRwdXRtY21jQ1Akc2FtcGxlc1ssYygibXVbNTBdIildLCBtYWluPSJtdVs1MF0gQUNGIikNCmBgYA0KDQpgYGB7cn0NCiMgU2VsZWN0aW5nIHRoZSB0YXUgc2FtcGxlcw0KdGF1X3NhbXBsZXMgPSBvdXRwdXRtY21jQ1Akc2FtcGxlc1tbMV1dWywgIlRhdSJdDQoNCiMgQ2FsY3VsYXRlIHRoZSBtZWFuDQp0bWVhbiA8LSBtZWFuKHRhdV9zYW1wbGVzKQ0KDQojIENhbGN1bGF0ZSB0aGUgMi41JSBxdWFudGlsZQ0KcTEgPC0gcXVhbnRpbGUodGF1X3NhbXBsZXMsIHByb2JzID0gMC4wNSkNCg0KIyBDYWxjdWxhdGUgdGhlIDk3LjUlIHF1YW50aWxlDQpxMiA8LSBxdWFudGlsZSh0YXVfc2FtcGxlcywgcHJvYnMgPSAwLjk1KQ0KDQoNCiMgRmluZGluZyB0aGUgeWVhciBjb3JyZXNwb25kaW5nIHRvIHFpDQp5ZWFyX3ExID0geWVhcltmbG9vcihxMSldDQp5ZWFyX3EyID0geWVhcltmbG9vcihxMildDQp5ZWFyX3RtZWFuID0geWVhcltmbG9vcih0bWVhbildDQoNCg0KDQojIFBsb3QgDQpwbG90KHllYXJbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV81MSldLCBkZWx0YV9sb2dkYXRhXzUxLCB0eXBlPSdsJywgeWxhYj0iRGVsdGEgbG9nLWNvMiIsIG1haW49IkRlbHRhIGxvZy1jbzIiLCB4bGFiPSJZZWFyIikNCg0KIyBsaW5lcyBmb3IgdGhlIGNoYW5nZSBwb2ludA0KYWJsaW5lKHY9eWVhcl90bWVhbiwgY29sPSJyZWQiLCBsd2Q9MS41KQ0KYWJsaW5lKHY9eWVhcl9xMSwgY29sPSJyZWQiLCBsd2Q9MS41LCBsdHkgPSAzKQ0KYWJsaW5lKHY9eWVhcl9xMiwgY29sPSJyZWQiLCBsd2Q9MS41LCBsdHkgPSAzKQ0KDQoNCiMgU2FtcGxlZCBtZWFuDQpzc0NQMiA9IHN1bW1hcnkob3V0cHV0bWNtY0NQKQ0KbjIgPSBsZW5ndGgoZGVsdGFfbG9nZGF0YV81MSkNCnBvaW50cyh5ZWFyWzE6bjJdLCBzc0NQMlsxOm4yLCJtZWFuIl0sIGNvbD0iZ3JlZW4iLCBwY2g9MTYsIGNleD0wLjYpDQoNCg0KDQojIENyZWF0ZSBhIGRhdGEgZnJhbWUgdG8gcHJpbnQgdGhlIHllYXJzDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBxMSA9IHllYXJfcTEsDQogIE1lYW4gPSB5ZWFyX3RtZWFuLA0KICBxMiA9IHllYXJfcTINCikNCmNvbG5hbWVzKGRmKSA8LSBjKCI1JSIsICJNZWFuIiwgIjk1JSIpDQoNCg0KIyBQcmludCB0aGUgZGF0YSBmcmFtZQ0KcHJpbnQoZGYpDQpgYGANCg0KQXMgd2UgY2FuIHNlZSBmcm9tIHRoZSBwbG90cyB3ZSBjYW4gaW5kZWVkIHNwb3QgYSBjaGFuZ2UgaW4gdGhlIG1lYW4gb2Ygb3VyIG1vZGVsIGFyb3VuZCAxOTczLCAqKndpdGgqKiAqKmEgOTAlIGNoYW5jZSB0aGlzIGNoYW5nZSBvY2N1cnJlZCBiZXR3ZWVuIDE5NzAgYW5kIDE5NzguKioNCg0KQW4gaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBmaW5kaW5nIGNvdWxkIGJlIHRoYXQgdGhlIHdvcnNlbmVkIGVjb25vbWljIGNvbmRpdGlvbnMgY2F1c2VkIGJ5IHRoZSBlY29ub21pYyByZWNlc3Npb25zIG9mIHRoYXQgZXJhIG1heSBoYXZlIGNvbnRyaWJ1dGVkIHRvIGEgc2xvd2Rvd24gaW4gQ08yIGVtaXNzaW9ucyBncm93dGguDQoNCiMjIyBSZWdyZXNzaW9ucyBvdmVyIHRoZSBjaGFuZ2UgcG9pbnRzDQoNCioqT3VyIGFuYWx5c2lzIGlkZW50aWZpZWQgdHdvIHBvdGVudGlhbCB0dXJuaW5nIHBvaW50cyBpbiB0aGUgQ08yIGVtaXNzaW9uIHRyZW5kOiAxOTUxIGFuZCAxOTczLioqIFRvIGdhaW4gYSBjbGVhcmVyIHZpc3VhbCB1bmRlcnN0YW5kaW5nIG9mIHRoZXNlIHNoaWZ0cywgd2UnbGwgc2VnbWVudCB0aGUgZGF0YSBpbnRvIHRocmVlIHBlcmlvZHM6ICoqYmVmb3JlKiosICoqYmV0d2VlbioqLCBhbmQgKiphZnRlcioqIHRoZXNlIGNyaXRpY2FsIHllYXJzLiAqKkJ5IGZpdHRpbmcgcmVncmVzc2lvbiBsaW5lcyB0byB0aGUgbG9nIG9mIENPMiBlbWlzc2lvbnMgZm9yIGVhY2ggcGVyaW9kLCB3ZSBjYW4gZGlyZWN0bHkgdmlzdWFsaXplIHRoZSBjaGFuZ2VzKiogaW4gdGhlIGVtaXNzaW9ucyB0cmFqZWN0b3J5Lg0KDQpgYGB7cn0NCiMgQWRkaW5nIGEgY29sdW1ucyBmb3IgdGhlIGxvZyBkYXRhDQp3b3JsZF9kYXRhJENPMl9sb2cgPSBDTzJfbG9nDQoNCiMgRmlsdGVyaW5nIGZvciBkYXRhIHVwIHVudGlsZSAxOTc1IChFbmQgb2YgdGhlIFBvc3QtV2FyIEVjb25vbWljIEJvb20pDQp3b3JsZF9kYXRhX2JlZm9yZTE5NzMgPC0gd29ybGRfZGF0YVt3b3JsZF9kYXRhJFllYXIgPCAxOTczLF0NCndvcmxkX2RhdGFfYWZ0ZXIxOTczIDwtIHdvcmxkX2RhdGFbd29ybGRfZGF0YSRZZWFyID4gMTk3MyxdDQoNCg0KIyBTcGxpdHRpbmcgdGhlIGRhdGEgaW4gJ2JlZm9yZScgYW5kICdhZnRlcicgdGhlIGNoYW5nZS1wb2ludA0Kd29ybGRfZGF0YV9iZWZvcmUxOTUxIDwtIHdvcmxkX2RhdGFfYmVmb3JlMTk3M1t3b3JsZF9kYXRhX2JlZm9yZTE5NzMkWWVhciA8IDE5NTEsXQ0Kd29ybGRfZGF0YV9hZnRlcjE5NTEgPC0gd29ybGRfZGF0YV9iZWZvcmUxOTczW3dvcmxkX2RhdGFfYmVmb3JlMTk3MyRZZWFyID4gMTk1MSxdDQoNCg0KIyBGaXR0aW5nIHNvbWUgbGluZWFyIG1vZGVscw0Kd29ybGRfZGF0YV9iZWZvcmUxOTUxLmxtID0gbG0oQ08yX2xvZyB+IFllYXIsIGRhdGEgPSB3b3JsZF9kYXRhX2JlZm9yZTE5NTEpDQp3b3JsZF9kYXRhX2FmdGVyMTk1MS5sbSA9IGxtKENPMl9sb2cgfiBZZWFyLCBkYXRhID0gd29ybGRfZGF0YV9hZnRlcjE5NTEpDQp3b3JsZF9kYXRhX2FmdGVyMTk3My5sbSA9IGxtKENPMl9sb2cgfiBZZWFyLCBkYXRhID0gd29ybGRfZGF0YV9hZnRlcjE5NzMpDQoNCiNQbG90cw0KcGxvdCh3b3JsZF9kYXRhJFllYXIsIHdvcmxkX2RhdGEkQ08yX2xvZywgdHlwZT0nbCcsIGNvbD0nZGFya2dyZWVuJywgeWxhYj0ibG9nKEFubnVhbCBDTzIpIiwgbWFpbj0ibG9nKENPMikiLCB4bGFiPSJZZWFyIikNCnBvaW50cyh3b3JsZF9kYXRhJFllYXIsIHdvcmxkX2RhdGEkQ08yX2xvZywgY29sPSdkYXJrZ3JlZW4nLCBwY2g9MTYsIGNleD0wLjUpDQoNCiMgTGluZXMNCmJldGFfYmVmb3JlXzE5NTEgPSBjb2VmKHdvcmxkX2RhdGFfYmVmb3JlMTk1MS5sbSkNCmJldGFfYWZ0ZXJfMTk1MSA9IGNvZWYod29ybGRfZGF0YV9hZnRlcjE5NTEubG0pDQpiZXRhX2FmdGVyXzE5NzMgPSBjb2VmKHdvcmxkX2RhdGFfYWZ0ZXIxOTczLmxtKQ0KYWJsaW5lKGJldGFfYmVmb3JlXzE5NTEsIGNvbD0ncmVkJywgbHR5PTMpDQphYmxpbmUoYmV0YV9hZnRlcl8xOTUxLCBjb2w9J2dyZWVuJywgbHR5PTMpDQphYmxpbmUoYmV0YV9hZnRlcl8xOTczLCBjb2w9J2JsdWUnLCBsdHk9MykNCg0KDQojIExlZ2VuZA0KbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kPWMoIkJlZm9yZSAxOTUxIiwgIkJldHdlZW4gMTk1MSBhbmQgMTk3MyIsICJBZnRlciAxOTczIiksIGNvbD1jKCJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIpLCBsdHk9MykNCg0KDQoNCg0KIyBQbG90IDINCnBsb3Qod29ybGRfZGF0YSRZZWFyLCB3b3JsZF9kYXRhJEFubnVhbENPMiwgdHlwZT0nbCcsIGNvbD0nZGFya2dyZWVuJywgeWxhYj0iQW5udWFsIENPMiAoYmlsbGlvbiB0KSIsIG1haW49IkNPMiBFbWlzc2lvbnMgZm9yIHRoZSBXb3JsZCIsIHhsYWI9IlllYXIiKQ0KcG9pbnRzKHdvcmxkX2RhdGEkWWVhciwgd29ybGRfZGF0YSRBbm51YWxDTzIsIGNvbD0nZGFya2dyZWVuJywgcGNoPTE2LCBjZXg9MC41KQ0KDQojICMgQWRkIGEgdmVydGljYWwgbGluZSBpbiB0aGUgdHdvIGNoYW5nZSBwb2ludHMNCmFibGluZSh2ID0gMTk1MSwgY29sID0gInJlZCIsIGx3ZCA9IDEsIGx0eSA9IDMpDQphYmxpbmUodiA9IDE5NzMsIGNvbCA9ICJncmVlbiIsIGx3ZCA9IDEsIGx0eSA9IDMpDQoNCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZD1jKCIxOTUxIiwgIjE5NzMiKSwgY29sPWMoInJlZCIsICJncmVlbiIpLCBsdHk9MykNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlIGZyb20gdGhlIHBsb3RzIHRoZXJlIGlzIGEgY2xlYXIgc2hpZnQgaW4gdGhlIHNwZWVkIG9mIGluY3JlYXNlIG9mIGVtaXNzaW9ucyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjaGFuZ2UgcG9pbnRzLg0KDQojIyBBUigxKSBtb2RlbCAtIFRpbWUgc2VyaWVzIHByZWRpY3Rpb24NCg0KQnVpbGRpbmcgb24gdGhlIGlkZW50aWZpZWQgY2hhbmdlIHBvaW50cyBpbiBDTzIgZW1pc3Npb25zLCBhIGNydWNpYWwgbmV4dCBzdGVwIGlzIHRvIGV4cGxvcmUgd2hhdCBsaWVzIGFoZWFkLg0KDQpUaGUgY3VycmVudCBlc3RpbWF0ZSAoMjAyMykgZm9yIHRoZSB3b3JsZCdzIHJlbWFpbmluZyBjYXJib24gYnVkZ2V0IGZvciBhIDUwJSBjaGFuY2UgdG8gc3RheSB1bmRlciAxLjUgwrBDICgyLjcgwrBGKSBpcyAqKjI1MCBnaWdhdG9ubmVzIENPMioqLg0KDQoqKkNhbiB3ZSBwcmVkaWN0IHdoZW4gd2UgbWlnaHQgcmVhY2ggYSBjcml0aWNhbCBsZXZlbCBvZiBDTzIgZW1pc3Npb25zIHRoYXQgd291bGQgcHVzaCBnbG9iYWwgdGVtcGVyYXR1cmVzIDEuNcKwQyBhYm92ZSBwcmUtaW5kdXN0cmlhbCBsZXZlbHM/KioNCg0KV2Ugd2lsbCBjYXJyeSBvbiB0aGlzIGFuYWx5c2lzIGJ5IGZpdHRpbmcgYW4gKipBUigxKSoqIG1vZGVsIHdpdGggcGFyYW1ldGVycyAkXG11LFxhbHBoYSQgYW5kICRcc2lnbWFeMiQgdG8gdGhlIGRlbHRhIG9mIHRoZSBsb2dhcml0aG0gb2YgQ08yIGVtaXNzaW9ucyBvbiBkYXRhIGFmdGVyIDE5NzggKDk1JSB0aGF0IHRoZSBjaGFuZ2UgcG9pbnQgaGFzIGhhcHBlbmVkKS4NCg0KV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcgcHJpb3JzOiAkJCANClxiZWdpbntzcGxpdH0gDQomIFxhbHBoYSBcc2ltIFxtYXRoY2Fse1V9KC0xLDEpICBcXCANCiYgXG11XHNpbSBcbWF0aGNhbHtOfSgwLDEwKSAgXFwgDQomICBcdGF1PVxmcmFjezF9e1xzaWdtYV4yfSBcc2ltIFxtYXRoY2Fse0d9KDAuMDAxLDAuMDAxKSAgIA0KXGVuZHtzcGxpdH0NCiQkDQoNCldlIGNob29zZSB0aGUgcHJpb3JzIGZvciAkXG11JCBhbmQgJFxmcmFjezF9e1xzaWdtYV4yfSQgdG8gYmUgd2Vha2x5IGluZm9ybWF0aXZlLg0KDQpgYGB7cn0NCiMgQXIoMSkNCm1vZGVsQVIuc3RyaW5nIDwtIm1vZGVsIHsNCiAgIyMgcGFyYW1ldGVyczogYWxwaGEsIHRhdSwgbTANCiAgIyBsaWtlbGlvaG9vZA0KICBtdVsxXSA8LSBZWzFdDQoNCiAgZm9yIChpIGluIDI6Tikgew0KICAgIFlbaV0gfiBkbm9ybShtdVtpXSwgdGF1KQ0KICAgIG11W2ldIDwtIG0wICsgYWxwaGEgKiBZW2ktMV0NCiAgfQ0KDQogICMgcHJlZGljdGlvbiBvdXQgb2Ygc2FtcGxlDQogIHlwT3V0WzFdID0gWVtOXSAgICAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCBzYW1wbGUgaXMgWVtOXSEhIQ0KICB5cE91dFsyXSB+IGRub3JtKG0wICsgYWxwaGEgKiBZW05dLCB0YXUpDQogIGZvcihrIGluIDM6TnByZWQpew0KICAgIHlwT3V0W2tdIH4gZG5vcm0obTAgKyBhbHBoYSAqIHlwT3V0W2stMV0sIHRhdSkNCiAgfQ0KDQoNCiAgIyBwcmlvcg0KICAjIGFscGhhIH4gZG5vcm0oMC4wLCAxKQ0KICBhbHBoYSB+IGR1bmlmKC0xLCAxKQ0KICB0YXUgfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKSAgICAgICAgIyB3ZWFrbHkgaW5mb3JtYXRpdmUgcHJpb3INCiAgbTAgfiBkbm9ybSgwLjAsIDAuMSkNCiAgc2lnbWEyIDwtIDEgLyB0YXUNCn0iDQoNCg0KDQojIEZpbHRlcmluZyB0aGUgZGF0YQ0Kd29ybGRfZGF0YV9hZnRlcjE5NzggPC0gd29ybGRfZGF0YVt3b3JsZF9kYXRhJFllYXIgPiAxOTc4LF0NCg0KQ08yX2xvZ183OCA9IGxvZyh3b3JsZF9kYXRhX2FmdGVyMTk3OCRBbm51YWxDTzIsIDEwKQ0KbjEgPSBsZW5ndGgoQ08yX2xvZ183OCkNCg0KZGVsdGFfbG9nZGF0YV83OCA9IENPMl9sb2dfNzhbMjpuMV0gLSBDTzJfbG9nXzc4WzE6bjEtMV0NCm4yID0gbGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNzgpDQoNCiMgWWVhcnMgDQp5ZWFyXzc4ID0gd29ybGRfZGF0YV9hZnRlcjE5NzgkWWVhcg0KDQoNCg0KIyBQYXJhbWV0ZXJzDQpOcHJlZCA9IDkgKyAxICAgICAgICAgIyBob3Jpem9uIGZvciBvdXQtb2Ytc2FtcGxlIHByZWRpY3Rpb24NCg0KDQoNCmxpbmVfZGF0YSA8LSBsaXN0KCJZIj1kZWx0YV9sb2dkYXRhXzc4LCAiTiIgPSBsZW5ndGgoZGVsdGFfbG9nZGF0YV83OCksICJOcHJlZCI9TnByZWQpDQoNCm91dHB1dG1jbWNBUiA8LSBqYWdzKG1vZGVsLmZpbGU9dGV4dENvbm5lY3Rpb24obW9kZWxBUi5zdHJpbmcpLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGxpbmVfZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudG8uc2F2ZSA9IGMoJ2FscGhhJywgInNpZ21hMiIsIm0wIiwieXBPdXQiLCAidGF1IiksDQogICAgICAgICAgICAgICAgICAgICBuLmFkYXB0PTEwMDAsIG4uaXRlcj0yMDAwMCwgbi5jaGFpbnMgPSAyLCBuLmJ1cm5pbiA9IDIwMDAsIA0KICAgICAgICAgICAgICAgICAgICAgbi50aGluID0gNSkNCmBgYA0KDQpgYGB7cn0NCiMgT3V0cHV0DQpvdXRwdXRtY21jQVINCg0KDQojIFRyYWNlIGFuZCBkZW5zaXR5DQpwbG90KG91dHB1dG1jbWNBUiRzYW1wbGVzWyxjKCdhbHBoYScpXSwgbWFpbj0icG9zdGVyaW9yIGFscGhhIikNCnBsb3Qob3V0cHV0bWNtY0FSJHNhbXBsZXNbLGMoJ3NpZ21hMicpXSwgbWFpbj0icG9zdGVyaW9yIHNpZ21hMiIpDQpwbG90KG91dHB1dG1jbWNBUiRzYW1wbGVzWyxjKCdtMCcpXSwgbWFpbj0icG9zdGVyaW9yIG0wIikNCnBsb3Qob3V0cHV0bWNtY0FSJHNhbXBsZXNbLGMoJ3RhdScpXSwgbWFpbj0icG9zdGVyaW9yIHRhdSIpDQoNCg0KIyBBdXRvY29ycmVsYXRpb24NCmF1dG9jb3JyLnBsb3Qob3V0cHV0bWNtY0FSJHNhbXBsZXNbLGMoJ2FscGhhJyldLCBtYWluPSAiYWxwaGEgQUNGIikNCmF1dG9jb3JyLnBsb3Qob3V0cHV0bWNtY0FSJHNhbXBsZXNbLGMoJ3NpZ21hMicpXSwgbWFpbj0gInNpZ21hMiBBQ0YiKQ0KYXV0b2NvcnIucGxvdChvdXRwdXRtY21jQVIkc2FtcGxlc1ssYygnbTAnKV0sIG1haW49ICJtMCBBQ0YiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBPdXQgb2Ygc2FtcGxlIHByZWRpY3Rpb24NCnlwX3ByZWQgPSBvdXRwdXRtY21jQVIkbWVhbiR5cE91dCAgICAgICAgICMgSGVyZSAneXBfcHJlZCcgaXMgdGhlICdkZWx0YS1sb2cnDQpxMV9wcmVkID0gb3V0cHV0bWNtY0FSJHEyLjUkeXBPdXQgICAgICAgICAjIENyZWRpYmxlIGludGVydmFsDQpxMl9wcmVkID0gb3V0cHV0bWNtY0FSJHE5Ny41JHlwT3V0DQoNCiMgWWVhcnMgZm9yIHByZWRpY3Rpb24NCm5ld195ZWFycyA8LSBzZXEoMjAyMSwgMjAyMSArIE5wcmVkIC0gMSkNCg0KDQojIFBsb3RzDQpwbG90KHllYXJfNzhbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV83OCldLCBkZWx0YV9sb2dkYXRhXzc4LCB0eXBlPSdsJywgeGxpbSA9IGMobWluKHllYXJfNzgpLCAyMDMwKSwgeWxhYj0iRGVsdGEgbG9nLWNvMiIsIG1haW49IkRlbHRhIGxvZy1jbzIgcHJlZGljdGlvbiIsIHhsYWI9IlllYXIiKQ0KbGluZXMobmV3X3llYXJzLCB5cF9wcmVkLCBwY2g9IioiLCBjb2w9ImRhcmtvcmFuZ2UiKQ0KYWJsaW5lKHY9bWluKG5ld195ZWFycyksIGNvbD0ib3JhbmdlIiwgbHR5ID0gMykNCiMgbGluZXMobmV3X3llYXJzLCBxMV9wcmVkLCB0eXBlPSJsIiwgY29sPSJvcmFuZ2UiLCBsd2QgPSAxLjUpDQojIGxpbmVzKG5ld195ZWFycywgcTJfcHJlZCwgdHlwZT0ibCIsIGNvbD0ib3JhbmdlIiwgbHdkID0gMS41KQ0KDQpsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQ9YygiUHJlZGljdGlvbiIpLCBjb2w9YygiZGFya29yYW5nZSIpLCBsdHk9MSkNCg0KYGBgDQoNCldlIG5lZWQgbm93IHRvIGNvbnZlcnQgdGhlIHByZWRpY3Rpb24gZnJvbSB0aGUgRGVsdGEgbG9nIENPMiB0byB0b3RhbCBBbm51YWwgQ08yLg0KDQpgYGB7cn0NCiMgUmV2ZXJzaW5nIHRoZSBkZWx0YS1sb2cgcmVsYXRpb24NCmRlbHRhX2xvZ19wcmVkaWN0ZWQgPSB5cF9wcmVkWzI6KE5wcmVkKV0gICAgIyBkaXNjYXJkIHRoZSBmaXJzdCBvbmUgKGxhc3QgZGF0YSBwb2ludCkNCmxhc3RfbG9nX3BvaW50ID0gd29ybGRfZGF0YSRDTzJfbG9nWzEyMV0NCg0KbG9nX3lwX3ByZWQgPC0gYXJyYXkoMCwgZGltID0gYyhsZW5ndGgoZGVsdGFfbG9nX3ByZWRpY3RlZCkpKQ0KbG9nX3lwX3ByZWRbMV0gPSBsYXN0X2xvZ19wb2ludCArIGRlbHRhX2xvZ19wcmVkaWN0ZWRbMV0NCg0KIyBjYWxjdWxhdGluZyBsb2dfeXBfcHJlZA0KZm9yIChpIGluIHNlcShsZW5ndGgoZGVsdGFfbG9nX3ByZWRpY3RlZCkgLSAxKSl7DQogIGxvZ195cF9wcmVkW2krMV0gPSBsb2dfeXBfcHJlZFtpXSArIGRlbHRhX2xvZ19wcmVkaWN0ZWRbaSsxXQ0KfQ0KDQojIEZpbmFsIHZhbHVlcyBpbiBCaWxsaW9ucyBvZiB0b25zDQp5cCA9IDEwXmxvZ195cF9wcmVkDQoNCg0KIyBZZWFycyBmb3IgQW5udWFsQ28yDQpuZXdfeWVhcnNfcCA9IG5ld195ZWFyc1syOmxlbmd0aChuZXdfeWVhcnMpXSArIDEgICAjIHJlbW92ZSB0aGUgZmlyc3QgYW5kIHNoaWZ0IGJ5IDENCg0KDQoNCiMgQ2FsY3VsYXRpbmcgdGhlIGNyaXRpY2FsIHllYXINCkNPMl9idWNrZXQgPSAyNTANCmkgPSAwDQp3aGlsZSAoQ08yX2J1Y2tldCA+IDApew0KICBpID0gaSsxDQogIGNyaXRpY2FsX3llYXIgPSBuZXdfeWVhcnNfcFtpXQ0KICBDTzJfYnVja2V0ID0gQ08yX2J1Y2tldCAtIHlwW2ldDQoNCg0KfQ0KDQoNCg0KIyBQbG90cw0KcGxvdCh3b3JsZF9kYXRhJFllYXIsIHdvcmxkX2RhdGEkQW5udWFsQ08yLCB0eXBlPSdsJywgY29sPSdkYXJrZ3JlZW4nLCB5bGFiPSJBbm51YWwgQ08yIChiaWxsaW9uIHQpIiwgbWFpbj0iQ08yIEVtaXNzaW9ucyBmb3IgdGhlIFdvcmxkIiwgeGxhYj0iWWVhciIsIHhsaW0gPSBjKG1pbih3b3JsZF9kYXRhJFllYXIpLCAyMDMwKSwgeWxpbSA9IGMobWluKHdvcmxkX2RhdGEkQW5udWFsQ08yKSwgNDIpKQ0KcG9pbnRzKHdvcmxkX2RhdGEkWWVhciwgd29ybGRfZGF0YSRBbm51YWxDTzIsIGNvbD0nZGFya2dyZWVuJywgcGNoPTE2LCBjZXg9MC41KQ0KDQojIFByZWRpY3Rpb24NCmxpbmVzKG5ld195ZWFyc19wLCB5cCwgcGNoPSIqIiwgY29sPSJkYXJrb3JhbmdlIikNCnBvaW50cyhuZXdfeWVhcnNfcCwgeXAsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrb3JhbmdlIikNCnBvaW50cyhjcml0aWNhbF95ZWFyLCB5cFtpXSwgcGNoPTEsIGNleD0xLCBsd2Q9MiwgY29sPSJyZWQiKQ0KDQojIENyaXRpY2FsIHllYXIgbGluZQ0KYWJsaW5lKHY9Y3JpdGljYWxfeWVhciwgY29sPSJyZWQiLCBsdHkgPSAzKQ0KDQojIEFkZCBhIGxlZ2VuZA0KbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kPWNyaXRpY2FsX3llYXIsIHBjaD0xLCBjb2w9InJlZCIsIHB0LmNleD0xLCBwdC5sd2Q9MikNCmBgYA0KDQpCYXNlZCBvbiBvdXIgYW5hbHlzaXMsIGNvbnRpbnVpbmcgdGhlIGN1cnJlbnQgZW1pc3Npb25zIHRyYWplY3RvcnkgY291bGQgcHVzaCB1cyB0b3dhcmRzICoqMS41wrBDKiogd2FybWluZyBieSAqKjIwMjkuKioNCg0KIyMgV2hpdGUgTm9pc2UgTW9kZWwgd2l0aCBzd2l0Y2hpbmcgdmFyaWFuY2UNCg0KSW4gb3VyIHByZXZpb3VzIGFuYWx5c2VzLCB3ZSBoYXZlIGV4YW1pbmVkIHRoZSB0cmVuZHMgaW4gdGhlIGluY3JlYXNlIG9mIENPMiBlbWlzc2lvbnMuDQoNCk5vdyB3ZSB3YW50IHRvIGFzayBhIGRpZmZlcmVudCBxdWVzdGlvbjogKipjYW4gd2UgZGV0ZWN0IGdsb2JhbCBjcmlzaXMgYW5kIG1ham9yIHdvcmxkd2lkZSBldmVudHMgYnkgbG9va2luZyBhdCBDTzIgZW1pc3Npb25zIGFsb25lPyoqDQoNCioqRG8gdGhleSBjYXVzZSBhIG5vdGljZWFibGUgdmFyaWFuY2UgaW4gdGhlIHRyZW5kIG9mIENPMiBlbWlzc2lvbnM/KioNCg0KV2Ugd2lsbCBjYXJyeSBvbiB0aGlzIGFuYWx5c2lzIGJ5IGZpdHRpbmcgYSB3aGl0ZSBub2lzZSBtb2RlbCB3aXRoIHN3aXRjaGluZyB2YXJpYW5jZSBvbiB0aGUgaW5jcmVtZW50IG9mIHRoZSBsb2cgb2YgQ08yIGVtaXNzaW9ucy4NCg0KV2Ugd2lsbCBzcGxpdCBvdXIgZGF0YSBieSBsZXZlcmFnaW5nIHRoZSBjaGFuZ2UgcG9pbnRzIGRpc2NvdmVyZWQgaW4gdHdvIHN1Yi1kYXRhc2V0czogeWVhcnMgKipiZWZvcmUqKiAqKjE5NDkqKiAoNSUgcXVhbnRpbGUgb2YgdGhlIGNoYW5nZSBwb2ludCBvbiB0aGUgdmFyaWFuY2UpIGFuZCAqKmFmdGVyKiogKioxOTc4KiogKDk1JSBxdWFudGlsZSBvZiB0aGUgY2hhbmdlIHBvaW50IG9uIHRoZSBtZWFuKS4NCg0KIyMjIEFmdGVyIDE5NzgNCg0KV2Ugc3RhcnQgb3VyIGFuYWx5c2lzIHdpdGggdGhlIHllYXJzIGFmdGVyIDE5NzguDQoNClRoZSBtb2RlbCBpcyBhcyBmb2xsb3dzOiQkDQp4X3QgOj1cbG9nKHlfe3QrMX0pLVxsb2coeV90KQ0KJCQgYW5kIHdlIGFzc3VtZSB0aGF0ICQkDQp4X3QgXHN0YWNrcmVse2lpZH17XHNpbX0gXG1hdGhjYWx7Tn0oXG11LFxzaWdtYV90XjIpDQokJCB3aXRoICQkDQpcc2lnbWFfdF57LTJ9PVxiZXRhXzErXGJldGFfMiBcZGVsdGFfdCBccXF1YWQgXGRlbHRhX3QgXHNpbSBCZXIocCkNCiQkDQoNCldlIGFzc3VtZSB0aGUgZm9sbG93aW5nIHByaW9yczokJCANClxiZWdpbntzcGxpdH0gDQomIFxiZXRhXzEgXHNpbSBcbWF0aGNhbHtHfSgwLjAwMSwgMC4wMDEpIFxcDQomIFxiZXRhXzIgXHNpbSBcbWF0aGNhbHtHfSgwLjAwMSwgMC4wMDEpIFxcDQomIFxkZWx0YV90IFxzaW0gQmVyKHApICBcXA0KJiBwIFxzaW0gQmV0YSgxLDEpICBcXA0KJiBcbXVcc2ltIFxtYXRoY2Fse059KDAsMTApICBcXA0KXGVuZHtzcGxpdH0NCiQkDQoNCldlIGNob29zZSB0aGUgcHJpb3JzIGZvciAkXG11JCwgJFxiZXRhXzEkLCAkXGJldGFfMiQgYW5kICRwJCB0byBiZSB3ZWFrbHkgaW5mb3JtYXRpdmUuDQoNCmBgYHtyfQ0KIyBGaWx0ZXJpbmcgZm9yIGRhdGEgYmVmb3JlIDE5NDkgYW5kIGFmdGVyIDE5NzgNCndvcmxkX2RhdGFfYWZ0ZXIxOTc4IDwtIHdvcmxkX2RhdGFbd29ybGRfZGF0YSRZZWFyID4gMTk3OCxdDQp3b3JsZF9kYXRhX2JlZm9yZTE5NDkgPC0gd29ybGRfZGF0YVt3b3JsZF9kYXRhJFllYXIgPCAxOTQ5LF0NCg0KDQoNCiMgQWZ0ZXIgMTk3OA0KQ08yX2xvZ183OCA9IGxvZyh3b3JsZF9kYXRhX2FmdGVyMTk3OCRBbm51YWxDTzIsIDEwKQ0KbjEgPSBsZW5ndGgoQ08yX2xvZ183OCkNCg0KZGVsdGFfbG9nZGF0YV83OCA9IENPMl9sb2dfNzhbMjpuMV0gLSBDTzJfbG9nXzc4WzE6bjEtMV0NCg0KIyBZZWFycyANCnllYXJfNzggPSB3b3JsZF9kYXRhX2FmdGVyMTk3OCRZZWFyDQoNCg0KDQojIEJlZm9yZSAxOTQ5DQpDTzJfbG9nXzQ5ID0gbG9nKHdvcmxkX2RhdGFfYmVmb3JlMTk0OSRBbm51YWxDTzIsIDEwKQ0KbjEgPSBsZW5ndGgoQ08yX2xvZ180OSkNCg0KZGVsdGFfbG9nZGF0YV80OSA9IENPMl9sb2dfNDlbMjpuMV0tQ08yX2xvZ180OVsxOm4xLTFdDQoNCiMgWWVhcnMgDQp5ZWFyXzQ5ID0gd29ybGRfZGF0YV9iZWZvcmUxOTQ5JFllYXINCmBgYA0KDQpUbyBtYWtlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgZGF0YSBtb3JlIGVuaGFuY2VkIHdlIGFwcGx5IHR3byB0cmFuc2Zvcm1hdGlvbnM6DQoNCi0gICBGaXJzdGx5IHdlIG5vcm1hbGl6ZSB0aGUgZGF0YQ0KDQotICAgVGhlbiB3ZSBlbGV2YXRlIHRvIHRoZSBwb3dlciAzDQoNClRoaXMgbWFrZXMgb3V0bGllcnMgaW4gdGhlIGRhdGEgZWFzaWVyIHRvIHNwb3QuDQoNCmBgYHtyfQ0KIyBFbmNoYW5jaW5nIHRoZSBkYXRhDQojIE5vcm1hbGl6YXRpb24gc3RlcA0KbWVhbl92YWwgPC0gbWVhbihkZWx0YV9sb2dkYXRhXzc4KQ0Kc2RfdmFsIDwtIHNkKGRlbHRhX2xvZ2RhdGFfNzgpDQoNCmRlbHRhX2xvZ2RhdGFfNzhfbm9ybSA8LSAoZGVsdGFfbG9nZGF0YV83OCAtIG1lYW5fdmFsKSAvIHNkX3ZhbA0KDQojIFRvIGVuaGFuY2UgdGhlIHZhcmFiaWxpdHkgaW4gdGhlIGRhdGEgd2UgZXZldmF0ZSBpdCBwb3dlciAzDQpkZWx0YV9sb2dkYXRhXzc4X3AzID0gZGVsdGFfbG9nZGF0YV83OF9ub3JtXjMNCg0KDQojIFBsb3RzDQojIE5vcm1hbA0KcGxvdCh5ZWFyXzc4WzE6bGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNzgpXSwgZGVsdGFfbG9nZGF0YV83OCwgeWxhYj0iRGVsdGEgbG9nLWNvMiIsIG1haW49IkRlbHRhIGxvZy1jbzIgYWZ0ZXIgMTk3OCIsIHhsYWI9IlllYXIiKQ0KDQojIEVuaGFuY2VkDQpwbG90KHllYXJfNzhbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV83OF9wMyldLCBkZWx0YV9sb2dkYXRhXzc4X3AzLCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgbWFpbj0iRW5jaGFuY2VkIERlbHRhIGxvZy1jbzIgYWZ0ZXIgMTk3OCIsIHhsYWI9IlllYXIiKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWw0LnN0cmluZyA8LSJtb2RlbCB7DQogICNsaWtlbGlvaG9vZCANCiAgZm9yKGkgaW4gMTpOKXsNCiAgICB4W2ldIH4gZG5vcm0obXUsIGludi52YXJbaV0pDQogICAgaW52LnZhcltpXSA8LSBiZXRhWzFdICsgYmV0YVsyXSAqIGRbaV0NCiAgfQ0KICANCiAgIyBQcmlvciBmb3IgZFtpXQ0KICBmb3IoayBpbiAxOk4pew0KICAgIGRba10gfiBkYmVybihwKSAgICAgICAgICAgICAjIHByb2JhYmlsaXRpZXMNCiAgfQ0KICANCiAgIyBQcmlvciBmb3IgYmV0YQ0KICAgICMgYmV0YVsxXSB+IGRleHAoMC4xKQ0KICAgICMgYmV0YVsyXSB+IGRleHAoMC4xKQ0KICAgIGJldGFbMV0gfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKSAgICAjIE5vbiBpbmZvcm1hdGl2ZQ0KICAgIGJldGFbMl0gfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKQ0KICAgIA0KICAjIFByaW9yIGZvciBiZXRhDQogICBwIH4gZGJldGEoMSwxKSAgICAgICAgICAgICAgICAgDQogICANCiAgIyBQcmlvciBmb3IgdGhlIG1lYW4NCiAgbXUgICB+IGRub3JtKDAsIDAuMSkNCn0iDQoNCiMgQWZ0ZXIgMTk3OA0KZGF0YV83OCA8LSBsaXN0KCJ4IiA9IGRlbHRhX2xvZ2RhdGFfNzhfcDMsICJOIiA9IGxlbmd0aChkZWx0YV9sb2dkYXRhXzc4X3AzKSkNCnNhbXBfNzggPC0gamFncyhtb2RlbC5maWxlID0gdGV4dENvbm5lY3Rpb24obW9kZWw0LnN0cmluZyksDQogICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGFfNzgsDQogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnRvLnNhdmU9IGMoImludi52YXIiLCAiZCIsICJtdSIpLA0KICAgICAgICAgICAgICAgICAgICAgbi5hZGFwdD0xMDAwLCBuLml0ZXI9NTAwMDAsIG4uY2hhaW5zID0gMSwgbi5idXJuaW4gPSAyMDAwLA0KICAgICAgICAgICAgICAgICAgICAgbi50aGluID0gNSkNCg0KDQojIE91dHB1dA0Kc2FtcF83OA0KDQoNCiMgVHJhY2UgYW5kIGRlbnNpdHkNCnBsb3Qoc2FtcF83OCRzYW1wbGVzWyxjKCdtdScpXSwgbWFpbj0icG9zdGVyaW9yIG11IikNCnBsb3Qoc2FtcF83OCRzYW1wbGVzWyxjKCdpbnYudmFyWzQyXScpXSwgbWFpbj0icG9zdGVyaW9yIGludi52YXJbNDJdIikNCg0KDQoNCiMgQXV0b2NvcnJlbGF0aW9uDQphdXRvY29yci5wbG90KHNhbXBfNzgkc2FtcGxlc1ssYygnbXUnKV0sIG1haW49InBvc3RlcmlvciBtdSIpDQphdXRvY29yci5wbG90KHNhbXBfNzgkc2FtcGxlc1ssYygnaW52LnZhcls0Ml0nKV0sIG1haW49InBvc3RlcmlvciBpbnYudmFyWzQyXSIpDQpgYGANCg0KV2Ugbm93IHBsb3QgdGhlIGJheWVzaWFuIGVzdGltYXRlIG9mICRcc2lnbWFeey0yfV90JC4gV2UgY2FuIHVzZSB0aGVzZSBlc3RpbWF0ZXMgdG8gb2J0YWluIGEgY2xhc3NpZmljYXRpb24gb2YgdGhlIG9ic2VydmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYW5jZS4NCg0KSGVyZSB3ZSBjaG9vc2UgdG8gZGl2aWRlIHRoZSB2YXJpYW5jZXMgaW4gdHdvIGNsYXNzZXMgdXNpbmcgdGhlIGxhdGVudCB2YXJpYWJsZXMgJFxkZWx0YV90JCAodGhlIHByb2JhYmlsaXR5IG9mIGJlbG9uZ2luZyB0byB0aGUgKipsb3dlciB2YXJpYW5jZSoqIGdyb3VwKS4NCg0KV2UgbWF5IGludGVycHJldCB0aGUgcmVkIGxpbmUgYXMgcGVyaW9kcyBvZiBoaWdoIHZvbGF0aWxpdHkuDQoNCmBgYHtyfQ0KIyBHZXR0aW5nIGludi52YXIgYW5kICdkW2ldJw0KaW52LnZhciA9IHNhbXBfNzgkbWVhbiRpbnYudmFyDQp0YXVlc3QgPSBzYW1wXzc4JG1lYW4kZCAgICAgICAgIyB0YXVlc3QgaXMgdGhlIHByb2JhYmlsaXR5ICdkW2ldJyANCg0KDQojIFBsb3R0aW5nIHRoZSB2YXJpYW5jZQ0KdmFyID0gMSAvIGludi52YXINCnBsb3QoeWVhcl83OFsxOmxlbmd0aChkZWx0YV9sb2dkYXRhXzc4X3AzKV0sIHZhciwgeGxhYj0iWWVhciIsIHlsYWI9InBvc3RlcmlvciB2YXJpYW5jZSIsIG1haW49InBvc3RlcmlvciB2YXJpYW5jZSIpDQoNCg0KIyBQbG90dGluZyB0aGUgcHJvYmFiaWxpdGllcw0KcGxvdCh5ZWFyXzc4WzE6bGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNzhfcDMpXSwgdGF1ZXN0LCB4bGFiPSJZZWFyIiwgeWxhYj0icG9zdGVyaW9yIHByb2JhYmlsaXR5IiwgbWFpbj0icG9zdGVyaW9yIHByb2JhYmlsaXR5IikNCmFibGluZShoPTAuMiwgY29sPSJyZWQiKQ0KIyBhYmxpbmUoaD0wLjI1LCBjb2w9Im9yYW5nZSIpDQoNCg0KDQojIFBsb3RzIDMgJiA0DQojIFNlbGVjdGluZyB0aGUgcmVkIHBvaW50cw0KaWkgPSBzZXEoMTpsZW5ndGgoeWVhcl83OCkpDQpvbyA9IGlpW3RhdWVzdCA8IDAuMl0gICAgICAjIEhpZ2hlciB2YXJpYW5jZSBtZWFucyBhIGxvd2VyIHRhdQ0KDQoNCiMgUGxvdCBpbiB0aGUgZGVsdGEgbG9nIGRvbWFpbg0KcGxvdCh5ZWFyXzc4WzE6bGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNzgpXSwgZGVsdGFfbG9nZGF0YV83OCwgbWFpbiA9ICJEZWx0YSBsb2ctY28yIGFmdGVyIDE5NzgiLCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgeGxhYj0iWWVhciIpDQpsaW5lcyh5ZWFyXzc4W29vXSwgZGVsdGFfbG9nZGF0YV83OFtvb10sIHR5cGU9InAiLCBjb2w9InJlZCIpDQoNCiMgVGhlIGxpbmVzIC8gcmVkIHBvaW50cyBpbmRpY2F0ZSBtb250aHMgd2l0aCBoaWdoIHZhcmlhbmNlDQpmb3IoayBpbiBvbyl7DQogIGFibGluZSh2ID0geWVhcl83OFtrXSwgY29sPSJyZWQiLCBsdHkgPSAzKQ0KfQ0KDQoNCg0KIyBQbG90IGluIHRoZSBBbm51YWxDbzIgZG9tYWluDQpwbG90KHllYXJfNzgsIHdvcmxkX2RhdGFfYWZ0ZXIxOTc4JEFubnVhbENPMiwgdHlwZT0nbCcsIGNvbD0nZGFya2dyZWVuJywgeWxhYj0iQW5udWFsIENPMiAoYmlsbGlvbiB0KSIsIG1haW49IkNPMiBFbWlzc2lvbnMgZm9yIHRoZSBXb3JsZCIsIHhsYWI9IlllYXIiKQ0KcG9pbnRzKHllYXJfNzgsIHdvcmxkX2RhdGFfYWZ0ZXIxOTc4JEFubnVhbENPMiwgY29sPSdkYXJrZ3JlZW4nLCBwY2g9MTYsIGNleD0wLjUpDQpsaW5lcyh5ZWFyXzc4W29vXSwgd29ybGRfZGF0YV9hZnRlcjE5NzgkQW5udWFsQ08yW29vXSwgdHlwZT0icCIsIGNvbD0icmVkIikNCg0KIyBUaGUgbGluZXMgLyByZWQgcG9pbnRzIGluZGljYXRlIHllYXJzIHdpdGggaGlnaCB2YXJpYW5jZQ0KZm9yKGsgaW4gb28pew0KICBhYmxpbmUodj15ZWFyXzc4W2tdLCBjb2w9InJlZCIsIGx0eSA9IDMpDQp9DQoNCiMgQWRkIGEgbGVnZW5kDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9IlNpZ25pZmljYXRpdmUgY2hhbmdlIHdpdGggY29uc2VjdXRpdmUgeWVhciIsIHBjaD0xLCBjb2w9InJlZCIsIHB0LmNleD0xLCBwdC5sd2Q9MiwgY2V4PTAuOCkNCg0KDQojIFdlIGNhbiBzdXBwb3NlIHRoYXQgeWVhcnMgd2l0aCBoaWdoIHZhcmlhY2UgaW5kaWNhdGUgY3Jpc2lzDQp5ZWFyXzc4W29vXQ0KYGBgDQoNClRoZSB5ZWFycyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IHZhcmlhbmNlIGluIENPMiBlbWlzc2lvbiB0cmVuZHMgYXJlOiAxOTgwLCAxOTkxLCAyMDAyLCAyMDA4LCAyMDA5LCAyMDE5LCAyMDIwLg0KDQpUaG9zZSB5ZWFycyBpbmRpY2F0ZSBwZXJpb2RzIHdoZXJlIHRoZSBzdWJzZXF1ZW50IHllYXIgZXhwZXJpZW5jZWQgYSBub3RpY2VhYmxlIGNoYW5nZSBpbiBDTzIgZW1pc3Npb25zICh3ZSBhbmFseXNlZCB0aGUgZGVsdGEgb2YgdGhlIGRhdGEpIGFuZCBjYW4gYmUgZGlyZWN0bHkgbGlua2VkIHdpdGggbWFqb3IgZ2xvYmFsIGVjb25vbWljIHBoZW5vbWVuYToNCg0KLSAgIDE5ODA6ICoqRWFybHkgMTk4MHMgUmVjZXNzaW9uKiosIGRlY3JlYXNlIGluIENPMiBlbWlzc2lvbnMuDQoNCi0gICAxOTkxOiAqKkRpc3NvbHV0aW9uIG9mIHRoZSBTb3ZpZXQgVW5pb24qKiBhbmQgKipFYXJseSAxOTkwcyBSZWNlc3Npb24qKiwgZGVjcmVhc2UgaW4gQ08yIGVtaXNzaW9ucy4NCg0KLSAgIDIwMDI6ICoqSW50cm9kdWN0aW9uIG9mIHRoZSBFdXJvKiosICoqMTEvMDkvMjAyMSBhdHRhY2tzKiosIGluY3JlYXNlIGluIENPMiBlbWlzc2lvbnMuDQoNCi0gICAyMDA4LzIwMDk6ICoqR2xvYmFsIEZpbmFuY2lhbCBDcmlzaXMqKiwgZGVjcmVhc2UgaW4gQ08yIGVtaXNzaW9ucy4NCg0KLSAgIDIwMTkvMjAyMDogKipDb3ZpZC0xOSBQYW5kZW1pYyoqLCBkZWNyZWFzZSBpbiBDTzIgZW1pc3Npb25zLg0KDQojIyMgQmVmb3JlIDE5NDkNCg0KV2Ugd2lsbCBub3cgcmVwZWF0IHRoZSBzYW1lIGFuYWx5c2lzIGZvciB0aGUgeWVhcnMgYmVmb3JlIDE5NDkuDQoNCmBgYHtyfQ0KIyBFbmNoYW5jaW5nIHRoZSBkYXRhDQojIE5vcm1hbGl6YXRpb24gc3RlcA0KbWVhbl92YWwgPC0gbWVhbihkZWx0YV9sb2dkYXRhXzQ5KQ0Kc2RfdmFsIDwtIHNkKGRlbHRhX2xvZ2RhdGFfNDkpDQoNCmRlbHRhX2xvZ2RhdGFfNDlfbm9ybSA8LSAoZGVsdGFfbG9nZGF0YV80OSAtIG1lYW5fdmFsKSAvIHNkX3ZhbA0KDQoNCiMgVG8gZW5oYW5jZSB0aGUgdmFyYWJpbGl0eSBpbiB0aGUgZGF0YSB3ZSBldmV2YXRlIGl0IHBvd2VyIDMNCmRlbHRhX2xvZ2RhdGFfNDlfcDMgPSBkZWx0YV9sb2dkYXRhXzQ5X25vcm1eMw0KDQoNCiMgUGxvdHMNCiMgTm9ybWFsDQpwbG90KHllYXJfNDlbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV80OSldLCBkZWx0YV9sb2dkYXRhXzQ5LCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgbWFpbj0iRGVsdGEgbG9nLWNvMiBiZWZvcmUgMTk0OSIsIHhsYWI9IlllYXIiKQ0KDQojIEVuaGFuY2VkDQpwbG90KHllYXJfNDlbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV80OV9wMyldLCBkZWx0YV9sb2dkYXRhXzQ5X3AzLCB5bGFiPSJEZWx0YSBsb2ctY28yIiwgbWFpbj0iRW5jaGFuY2VkIERlbHRhIGxvZy1jbzIgYmVmb3JlIDE5NDkiLCB4bGFiPSJZZWFyIikNCmBgYA0KDQpUaGUgZ2VuZXJhbCB2YXJpYW5jZSBiZXR3ZWVuIGRhdGFwb2ludHMgaXMgaGlnaGVyIGluIHRoaXMgcGVyaW9kLiBUbyBvYnRhaW4gbW9yZSBleHRyZW1lIHJlc3VsdHMgd2UgaW50cm9kdWNlIGEgc3Ryb25nIGJpYXMgd2l0aCByZXNwZWN0IHRvIGxvd2VyIHZhcmlhbmNlIGluIHRoZSBtb2RlbCBhbmQgd2UgY2hhbmdlIHRoZSBwcmlvcnMgdG86DQoNCiQkIA0KXGJlZ2lue3NwbGl0fSANCiYgXGJldGFfMSBcc2ltIFxtYXRoY2Fse0V9KDEwKSBcXA0KJiBcYmV0YV8yIFxzaW0gXG1hdGhjYWx7RX0oMTApIFxcDQomIFxkZWx0YV90IFxzaW0gQmVyKHApICBcXA0KJiBwIFxzaW0gQmV0YSgxLDEpICBcXA0KJiBcbXVcc2ltIFxtYXRoY2Fse059KDAsMTApICBcXA0KXGVuZHtzcGxpdH0NCiQkDQoNCldlIGNob29zZSB0aGUgcHJpb3JzIGZvciAkXG11JCwgYW5kICRwJCB0byBiZSB3ZWFrbHkgaW5mb3JtYXRpdmUsIHdoaWxlIGZvciAkXGJldGFfMSQgYW5kICRcYmV0YV8yJCB3ZSBpbmplY3RlZCBhIHN0cm9uZyBiaWFzIHRvd2FyZCB2YWx1ZXMgbmVhciB6ZXJvIChoaWdoZXIgcGFyYW1ldGVyIG9mIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24pLg0KDQpPc3M6IFdlIGFyZSBwcmFjdGljbHkgdGVsbGluZyB0aGUgbW9kZWwgdGhhdCB0aGUgZGF0YSBoYXMgaGlnaCB2YXJpYW5jZSAoYXMgd2UgY2FuIHNlZSBmcm9tIHRoZSBwbG90dGVkIGRhdGEpIGFuZCBpdCBuZWVkcyB0byBsZWFybiBhICRcZGVsdGFfdCQgdG8gY2xhc3NpZnkgdGhlIHBvaW50cyB3aXRoIGxvd2VyIHZhcmlhbmNlLg0KDQpgYGB7cn0NCm1vZGVsNC5zdHJpbmcgPC0ibW9kZWwgew0KICAjbGlrZWxpb2hvb2QNCiAgZm9yKGkgaW4gMTpOKXsNCiAgICB4W2ldIH4gZG5vcm0obXUsIGludi52YXJbaV0pDQogICAgaW52LnZhcltpXSA8LSBiZXRhWzFdICsgYmV0YVsyXSAqIGRbaV0NCiAgfQ0KDQogICMgUHJpb3IgZm9yIGRbaV0NCiAgZm9yKGsgaW4gMTpOKXsNCiAgICBkW2tdIH4gZGJlcm4ocCkgICAgICAgICAgICAgIyBwcm9iYWJpbGl0aWVzDQogIH0NCg0KICAjIFByaW9yIGZvciBiZXRhDQogICAgYmV0YVsxXSB+IGRleHAoMTApICAgICAgICMgU3Ryb25nIHByaW9yIHRvIGdlbmVyYXRlIG1vcmUgZXh0cmVtZSByZXN1bHRzDQogICAgYmV0YVsyXSB+IGRleHAoMTApDQogICAgIyBiZXRhWzFdIH4gZGdhbW1hKDAuMDAxLCAwLjAwMSkgICAgIyBOb24gaW5mb3JtYXRpdmUNCiAgICAjIGJldGFbMl0gfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKQ0KDQogICMgUHJpb3IgZm9yIGJldGENCiAgIHAgfiBkYmV0YSgxLDEpDQoNCiAgIyBQcmlvciBmb3IgdGhlIG1lYW4NCiAgbXUgICB+IGRub3JtKDAsIDAuMSkNCn0iDQoNCg0KIyBBZnRlciAxOTc4DQpkYXRhXzQ5IDwtIGxpc3QoIngiID0gZGVsdGFfbG9nZGF0YV80OV9wMywgIk4iID0gbGVuZ3RoKGRlbHRhX2xvZ2RhdGFfNDlfcDMpKQ0Kc2FtcF80OSA8LSBqYWdzKG1vZGVsLmZpbGUgPSB0ZXh0Q29ubmVjdGlvbihtb2RlbDQuc3RyaW5nKSwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YV80OSwNCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudG8uc2F2ZT0gYygiaW52LnZhciIsICJkIiwgIm11IiksDQogICAgICAgICAgICAgICAgICAgICBuLmFkYXB0PTEwMDAsIG4uaXRlcj01MDAwMCwgbi5jaGFpbnMgPSAxLCBuLmJ1cm5pbiA9IDIwMDAsDQogICAgICAgICAgICAgICAgICAgICBuLnRoaW4gPSA1KQ0KDQoNCiMgT3V0cHV0DQpzYW1wXzQ5DQoNCg0KIyBUcmFjZSBhbmQgZGVuc2l0eQ0KcGxvdChzYW1wXzQ5JHNhbXBsZXNbLGMoJ211JyldLCBtYWluPSJwb3N0ZXJpb3IgbXUiKQ0KcGxvdChzYW1wXzQ5JHNhbXBsZXNbLGMoJ2ludi52YXJbMTJdJyldLCBtYWluPSJwb3N0ZXJpb3IgaW52LnZhclsxMl0iKQ0KDQoNCg0KIyBBdXRvY29ycmVsYXRpb24NCmF1dG9jb3JyLnBsb3Qoc2FtcF80OSRzYW1wbGVzWyxjKCdtdScpXSwgbWFpbj0icG9zdGVyaW9yIG11IikNCmF1dG9jb3JyLnBsb3Qoc2FtcF80OSRzYW1wbGVzWyxjKCdpbnYudmFyWzEyXScpXSwgbWFpbj0icG9zdGVyaW9yIGludi52YXJbMTJdIikNCmBgYA0KDQpgYGB7cn0NCiMgR2V0dGluZyBpbnYudmFyIGFuZCAnZFtpXScNCmludi52YXIgPSBzYW1wXzQ5JG1lYW4kaW52LnZhcg0KdGF1ZXN0ID0gc2FtcF80OSRtZWFuJGQgICAgICAgICMgdGF1ZXN0IGlzIHRoZSBwcm9iYWJpbGl0eSAnZFtpXScgDQoNCg0KIyBQbG90dGluZyB0aGUgdmFyaWFuY2UNCnZhciA9IDEgLyBpbnYudmFyDQpwbG90KHllYXJfNDlbMTpsZW5ndGgoZGVsdGFfbG9nZGF0YV80OV9wMyldLCB2YXIsIHhsYWI9IlllYXIiLCB5bGFiPSJwb3N0ZXJpb3IgdmFyaWFuY2UiLCBtYWluPSJwb3N0ZXJpb3IgdmFyaWFuY2UiKQ0KDQoNCiMgUGxvdHRpbmcgdGhlIHByb2JhYmlsaXRpZXMNCnBsb3QoeWVhcl80OVsxOmxlbmd0aChkZWx0YV9sb2dkYXRhXzQ5X3AzKV0sIHRhdWVzdCwgeGxhYj0iWWVhciIsIHlsYWI9InBvc3RlcmlvciBwcm9iYWJpbGl0eSIsIG1haW49InBvc3RlcmlvciBwcm9iYWJpbGl0eSIpDQphYmxpbmUoaD0wLjIsIGNvbD0icmVkIikNCiMgYWJsaW5lKGg9MC4yNSwgY29sPSJvcmFuZ2UiKQ0KDQoNCg0KIyBQbG90cyAzICYgNA0KIyBTZWxlY3RpbmcgdGhlIHJlZCBwb2ludHMNCmlpID0gc2VxKDE6bGVuZ3RoKHllYXJfNDkpKQ0Kb28gPSBpaVt0YXVlc3QgPCAwLjJdICAgICAgIyBIaWdoZXIgdmFyaWFuY2UgbWVhbnMgYSBsb3dlciB0YXUNCg0KDQojIFBsb3QgaW4gdGhlIGRlbHRhIGxvZyBkb21haW4NCnBsb3QoeWVhcl80OVsxOmxlbmd0aChkZWx0YV9sb2dkYXRhXzQ5KV0sIGRlbHRhX2xvZ2RhdGFfNDksIG1haW4gPSAiRGVsdGEgbG9nLWNvMiBiZWZvcmUgMTk0OSIsIHlsYWI9IkRlbHRhIGxvZy1jbzIiLCB4bGFiPSJZZWFyIikNCmxpbmVzKHllYXJfNDlbb29dLCBkZWx0YV9sb2dkYXRhXzQ5W29vXSwgdHlwZT0icCIsIGNvbD0icmVkIikNCg0KIyBUaGUgbGluZXMgLyByZWQgcG9pbnRzIGluZGljYXRlIG1vbnRocyB3aXRoIGhpZ2ggdmFyaWFuY2UNCmZvcihrIGluIG9vKXsNCiAgYWJsaW5lKHYgPSB5ZWFyXzQ5W2tdLCBjb2w9InJlZCIsIGx0eSA9IDMpDQp9DQoNCg0KDQojIFBsb3QgaW4gdGhlIEFubnVhbENvMiBkb21haW4NCnBsb3QoeWVhcl80OSwgd29ybGRfZGF0YV9iZWZvcmUxOTQ5JEFubnVhbENPMiwgdHlwZT0nbCcsIGNvbD0nZGFya2dyZWVuJywgeWxhYj0iQW5udWFsIENPMiAoYmlsbGlvbiB0KSIsIG1haW49IkNPMiBFbWlzc2lvbnMgZm9yIHRoZSBXb3JsZCIsIHhsYWI9IlllYXIiKQ0KcG9pbnRzKHllYXJfNDksIHdvcmxkX2RhdGFfYmVmb3JlMTk0OSRBbm51YWxDTzIsIGNvbD0nZGFya2dyZWVuJywgcGNoPTE2LCBjZXg9MC41KQ0KbGluZXMoeWVhcl80OVtvb10sIHdvcmxkX2RhdGFfYmVmb3JlMTk0OSRBbm51YWxDTzJbb29dLCB0eXBlPSJwIiwgY29sPSJyZWQiKQ0KDQojIFRoZSBsaW5lcyAvIHJlZCBwb2ludHMgaW5kaWNhdGUgeWVhcnMgd2l0aCBoaWdoIHZhcmlhbmNlDQpmb3IoayBpbiBvbyl7DQogIGFibGluZSh2PXllYXJfNzhba10sIGNvbD0icmVkIiwgbHR5ID0gMykNCn0NCg0KIyBBZGQgYSBsZWdlbmQNCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZD0iU2lnbmlmaWNhdGl2ZSBjaGFuZ2Ugd2l0aCBjb25zZWN1dGl2ZSB5ZWFyIiwgcGNoPTEsIGNvbD0icmVkIiwgcHQuY2V4PTEsIHB0Lmx3ZD0yLCBjZXg9MC44KQ0KDQoNCiMgV2UgY2FuIHN1cHBvc2UgdGhhdCB5ZWFycyB3aXRoIGhpZ2ggdmFyaWFjZSBpbmRpY2F0ZSBjcmlzaXMNCnllYXJfNDlbb29dDQpgYGANCg0KVGhlIHllYXJzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgdmFyaWFuY2UgaW4gQ08yIGVtaXNzaW9uIHRyZW5kcyBhcmU6IDE5MTMsIDE5MTggLDE5MTksIDE5MjAsIDE5MzAsIDE5MzEsIDE5NDQuDQoNClRob3NlIHllYXJzIGluZGljYXRlIHBlcmlvZHMgd2hlcmUgdGhlIHN1YnNlcXVlbnQgeWVhciBleHBlcmllbmNlZCBhIG5vdGljZWFibGUgY2hhbmdlIGluIENPMiBlbWlzc2lvbnMgKHdlIGFuYWx5c2VkIHRoZSBkZWx0YSBvZiB0aGUgZGF0YSkgYW5kIGNhbiBiZSBkaXJlY3RseSBsaW5rZWQgd2l0aCBtYWpvciBnbG9iYWwgZWNvbm9taWMgcGhlbm9tZW5hOg0KDQotICAgMTkxMzogKipCZWdpbm5pbmcgb2YgV29ybGQgV2FyIEkqKiAoMTkxNCkNCg0KLSAgIDE5MTgvMTkxOS8xOTIwOiAqKkVuZCBvZiBXb3JsZCBXYXIgSSoqICgxOTE4KSBhbmQgYWZ0ZXJtYXRoDQoNCi0gICAxOTMwLzE5MzE6ICoqVGhlIEdyZWF0IERlcHJlc3Npb24qKiAoMTkyOeKAkzE5MzkpDQoNCi0gICAxOTQ0OiAqKkVuZCBvZiBXb3JsZCBXYXIgSUkqKiAoMTk0NSkNCg0KKipEaXNjbGFpbWVyOioqIFRoZSB5ZWFycyBiZXR3ZWVuIDE5MDAgYW5kIDE5NDUgd2VyZSB0cm91YmxlZCBhbmQgYSBsb3Qgb2Ygc2lnbmlmaWNhbnQgZXZlbnRzIGhhcHBlbmVkIGluIHRoYXQgcGVyaW9kLiBUaGlzIG1ha2VzIHRoZSBnZW5lcmFsIHZhcmlhYmlsaXR5IGJldHdlZW4gZWFjaCB5ZWFyIG1vcmUgYWNjZW50dWF0ZWQgYW5kIGFzIHN1Y2ggc2lnbmlmaWNhbnQgZXZlbnRzIGFyZSBoYXJkZXIgdG8gc3BvdC4NCg0KYGBge3J9DQojDQpgYGANCg0KIyBEYXRhc2V0IDINCg0KV2Ugd2lsbCBjb250aW51ZSBvdXIgYW5hbHlzaXMgYnkgYW5hbHl6aW5nIHRoZSBpbXBhY3Qgb2YgdmFyaW91cyBmYWN0b3JzIG9uIENPMiBlbWlzc2lvbnMgaW4gcmVjZW50IHllYXJzLg0KDQoqKlNvdXJjZXM6KioNCg0KPGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnL2dyYXBoZXIvZW5lcmd5LXVzZS1wZXItY2FwaXRhLXZzLWdkcC1wZXItY2FwaXRhPg0KDQo8aHR0cHM6Ly9vdXJ3b3JsZGluZGF0YS5vcmcvZ3JhcGhlci9jbzItZW1pc3Npb25zLXZzLWdkcD4NCg0KPGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnL2dyYXBoZXIvbG93LWNhcmJvbi1lbmVyZ3ktY29uc3VtcHRpb24/Y291bnRyeT1PTU4+DQoNCjxodHRwczovL291cndvcmxkaW5kYXRhLm9yZy9ncmFwaGVyL3VyYmFuaXphdGlvbi12cy1nZHA+DQoNCjxodHRwczovL291cndvcmxkaW5kYXRhLm9yZy9ncmFwaGVyL251bWJlci1vZi1pbnRlcm5ldC11c2Vycy1ieS1jb3VudHJ5Pg0KDQoqKlNob3J0IGRlc2NyaXB0aW9uOioqDQoNClRoaXMgZGF0YXNldCBmb2N1c2VzIG9uIGh1bWFuIGVtaXNzaW9ucyBvZiBDTzIgYW5kIG90aGVyIGdyZWVuaG91c2UgZ2FzZXMsIHdoaWNoIGFyZSBwcmltYXJ5IGRyaXZlcnMgb2YgY2xpbWF0ZSBjaGFuZ2UgYW5kIG9uZSBvZiB0aGUgd29ybGQncyBtb3N0IHByZXNzaW5nIGNoYWxsZW5nZXMuIEl0IGluY2x1ZGVzIGRhdGEgZm9yIHZhcmlvdXMgbmF0aW9ucyBhbmQgeWVhcnMgKDIwMDYgdG8gMjAwOSksIGVuY29tcGFzc2luZyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoNCg0KLSAgICoqY291bnRyeSoqOiBuYW1lIG9mIHRoZSBjb3VudHJ5Lg0KDQotICAgKip5Kio6IHllYXIuDQoNCi0gICAqKkVuZXJneVVzZSoqOiBFbmVyZ3kgdXNlIFtrZyBvZiBvaWwgZXF1aXZhbGVudCBwZXIgY2FwaXRhXS4NCg0KLSAgICoqR0RQKio6IEdyb3NzIERvbWVzdGljIFByb2R1Y3QgcGVyIGNhcGl0YS4gWzFcJCBwZXIgY2FwaXRhXQ0KDQotICAgKipwb3AqKjogUG9wdWxhdGlvbiAoaGlzdG9yaWNhbCBlc3RpbWF0ZXMpLg0KDQotICAgKipjbzJwZXJjYXAqKjogQW5udWFsIENPMiBlbWlzc2lvbnMgcGVyIGNhcGl0YS4gW3RvbnMgcGVyIGNhcGl0YV0NCg0KLSAgICoqTG93Y2FyYm9uX2VuZXJneSoqOiBMb3ctY2FyYm9uIGVuZXJneSAoJSBzdWIgZW5lcmd5KS4gTG93LWNhcmJvbiBlbmVyZ3kgaXMgZGUMZmluZWQgYXMgdGhlIHN1bSBvZiBudWNsZWFyIGFuZCByZW5ld2FibGUgc291cmNlcy4gUmVuZXdhYmxlIHNvdXJjZXMgaW5jbHVkZSBoeWRyb3Bvd2VyLCBzb2xhciwgd2luZCwgZ2VvdGhlcm1hbCwgd2F2ZSBhbmQgdGlkYWwgYW5kIGJpb2VuZXJneS4gVHJhZGl0aW9uYWwgYmlvZnVlbHMgYXJlIG5vdCBpbmNsdWRlZC4NCg0KLSAgICoqdXJiKio6IHVyYmFuIHBvcHVsYXRpb24gKCUpIC4NCg0KLSAgICoqaW50ZXJuZXQqKjogbnVtYmVyIG9mIGludGVybmV0IHVzZXJzIChPV0lEIGJhc2VkIG9uIFdCICYgVU4pLg0KDQojIyBUcmFuc2Zvcm1hdGlvbnMgdG8gdGhlIG9yaWdpbmFsIGRhdGFzZXQNCg0KVG8gZmFjaWxpdGF0ZSBvdXIgYW5hbHlzaXMgd2Ugd2lsbCBhcHBseSBzb21lIHRyYW5zZm9ybWF0aW9ucyB0byB0aGUgZGF0YS4NCg0KVGhlIGZpbmFsIHN0cnVjdHVyZSB3aWxsIGJlIHRoZSBmb2xsb3dpbmc6DQoNCi0gICAqKmNvdW50cnkqKjogbmFtZSBvZiB0aGUgY291bnRyeS4NCg0KLSAgICoqeSoqOiB5ZWFyLg0KDQotICAgKipFbmVyZ3lVc2UqKjogRW5lcmd5IHVzZSBbdG9ucyBvZiBvaWwgZXF1aXZhbGVudCBwZXIgY2FwaXRhXS4NCg0KLSAgICoqR0RQKio6IEdyb3NzIERvbWVzdGljIFByb2R1Y3QgcGVyIGNhcGl0YS4gWzEwMDBcJCBwZXIgY2FwaXRhXQ0KDQotICAgKipwb3AqKjogUG9wdWxhdGlvbiAoaGlzdG9yaWNhbCBlc3RpbWF0ZXMpLiBbbWlsaW9ucyBwZW9wbGVdDQoNCi0gICAqKmNvMnBlcmNhcCoqOiBBbm51YWwgQ08yIGVtaXNzaW9ucyBwZXIgY2FwaXRhLiBbdG9ucyBwZXIgY2FwaXRhXQ0KDQotICAgKipMb3djYXJib25fZW5lcmd5Kio6IExvdy1jYXJib24gZW5lcmd5ICglIHN1YiBlbmVyZ3kpLiBMb3ctY2FyYm9uIGVuZXJneSBpcyBkZQxmaW5lZCBhcyB0aGUgc3VtIG9mIG51Y2xlYXIgYW5kIHJlbmV3YWJsZSBzb3VyY2VzLiBSZW5ld2FibGUgc291cmNlcyBpbmNsdWRlIGh5ZHJvcG93ZXIsIHNvbGFyLCB3aW5kLCBnZW90aGVybWFsLCB3YXZlIGFuZCB0aWRhbCBhbmQgYmlvZW5lcmd5LiBUcmFkaXRpb25hbCBiaW9mdWVscyBhcmUgbm90IGluY2x1ZGVkLg0KDQotICAgKip1cmIqKjogdXJiYW4gcG9wdWxhdGlvbi4gWyVdDQoNCi0gICAqKmludGVybmV0Kio6IG51bWJlciBvZiBpbnRlcm5ldCB1c2VycyAoT1dJRCBiYXNlZCBvbiBXQiAmIFVOKS4NCg0KLSAgICoqaW50ZXJuZXRfdXNlcnNfcmF0aW8qKjogcmF0aW8gb2YgaW50ZXJuZXQgdXNlcnMgb3ZlciB0aGUgdG90YWwgcG9wdWxhdGlvbi4NCg0KYGBge3J9DQpybShsaXN0PWxzKCkpDQoNCmxpYnJhcnkocmphZ3MpDQpsaWJyYXJ5KGJheWVzcGxvdCkNCmxpYnJhcnkoamFnc1VJKQ0KbGlicmFyeShsb28pDQoNCg0KIyBMb2FkaW5nIHRoZSBkYXRhDQpDTzIgPC0gcmVhZC5jc3YoIkRhdGEvQ08yLmNzdiIpDQojIFJlbW92aW5nIHRoZSAnV29ybGQnIGRhdGFwb2ludHMNCkNPMiA8LSBDTzJbQ08yJGNvdW50cnkgIT0gJ1dvcmxkJyxdDQpoZWFkKENPMikNCnN1bW1hcnkoQ08yKQ0KDQojIENhbGN1bGF0ZSB0aGUgcmF0aW8gb2YgaW50ZXJuZXQgdXNlcnMgdG8gcG9wdWxhdGlvbg0KQ08yJGludGVybmV0X3VzZXJzX3JhdGlvID0gQ08yJGludGVybmV0IC8gQ08yJHBvcCAqIDEwMA0KIyBSZXNjYWxpbmcgc29tZSBkYXRhDQpDTzIkR0RQID0gQ08yJEdEUCAvIDEwMDANCkNPMiRFbmVyZ3lVc2UgPSBDTzIkRW5lcmd5VXNlIC8gMTAwMA0KQ08yJHBvcCA9IENPMiRwb3AgLyAxMDAwMDAwDQoNCg0KDQojIENvbG91ciBwYWxldHRlDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCm51bV9jb3VudHJpZXMgPC0gbGVuZ3RoKHVuaXF1ZShDTzIkY291bnRyeSkpDQpwYWxldHRlX2NvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoMTIsICJTZXQxIikpKG51bV9jb3VudHJpZXMpDQoNCg0KDQojIFBsb3R0aW5nIHRoZSBkYXRhIGJ5IGNvdW50cnkNCnBsb3QoQ08yJEdEUCwgQ08yJGNvMnBlcmNhcCwgDQogICAgIHhsYWIgPSAiR0RQIFsxSyRdIiwgeWxhYiA9ICJDTzIgcGVyIGNhcGl0YSBbdG9uc10iLCANCiAgICAgbG9nID0gInh5IiwgDQogICAgIGNvbCA9IHBhbGV0dGVfY29sb3JzW2FzLm51bWVyaWMoZmFjdG9yKENPMiRjb3VudHJ5KSldDQogICAgICkNCg0KDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9IkVhY2ggY29sb3VyIHJlcHJlc2VudHMgYSBjb3VudHJ5IiwgY2V4PTAuNykNCmBgYA0KDQojIyBEZW5zaXR5ICYgRXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcw0KDQpXZSBzdGFydCBvdXIgYW5hbHlzaXMgYnkgcGxvdHRpbmcgdGhlIGRlbnNpdGllcyBhbmQgdmlzdWFsbHkgcmVwcmVzZW50aW5nIHRoZSBkYXRhIGluIHJlbGF0aW9uIHRvIENPMiBlbWlzc2lvbnMuIFRoaXMgcHJlbGltaW5hcnkgZXhhbWluYXRpb24gaGVscHMgdXMgdW5kZXJzdGFuZCB0aGUgZGlzdHJpYnV0aW9uIGFuZCByZWxhdGlvbnNoaXBzIHdpdGhpbiB0aGUgZGF0YS4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KcGxvdF9oaXN0X3NjYXR0ZXIgPC0gZnVuY3Rpb24oZGF0YSwgaGlzdF92YXIsIHNjYXR0ZXJfdmFyX3gsIHNjYXR0ZXJfdmFyX3ksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2hpc3RfdmFyLCBuYW1lX3gsIG5hbWVfeSwgdW5pdF94LCB1bml0X3ksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfc2NhbGUgPSBGQUxTRSwgYmlucyA9IDIwKSANCnsNCiAgIyBQbG90IGhpc3RvZ3JhbQ0KICBoaXN0ID0NCiAgICBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXNfc3RyaW5nKHg9aGlzdF92YXIpKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9YWZ0ZXJfc3RhdChkZW5zaXR5KSksIGNvbG9yPSdzdGVlbGJsdWUnLA0KICAgICAgICAgICAgICAgICAgIGZpbGw9J2xpZ2h0Ymx1ZScsIGJpbnMgPSBiaW5zKSArDQogICAgZ2d0aXRsZShwYXN0ZSgiSGlzdG9ncmFtIG9mIiwgbmFtZV9oaXN0X3ZhcikpICsgDQogICAgeGxhYihuYW1lX2hpc3RfdmFyKQ0KICAgIHlsYWIoIkRlbnNpdHkiKQ0KDQogICMgUGxvdCBzY2F0dGVyIHBsb3QNCiAgc2NhdHRlciA9DQogICAgZ2dwbG90KGRhdGE9ZGF0YSwgYWVzX3N0cmluZyh4PXNjYXR0ZXJfdmFyX3gsIHk9c2NhdHRlcl92YXJfeSkpICsNCiAgICBnZW9tX3BvaW50KGNvbG9yPSdzdGVlbGJsdWUnKSArDQogICAgZ2d0aXRsZShwYXN0ZShuYW1lX3ksICJ2cy4iLCBuYW1lX3gpKSArDQogICAgeGxhYihwYXN0ZShuYW1lX3gsIHVuaXRfeCkpICsNCiAgICB5bGFiKHBhc3RlKG5hbWVfeSwgdW5pdF95KSkNCg0KDQogICMgQXBwbHkgbG9nYXJpdGhtaWMgc2NhbGUgaWYgbG9nX3NjYWxlIGlzIFRSVUUNCiAgaWYgKGxvZ19zY2FsZSkgew0KICAgIHNjYXR0ZXIgPSBzY2F0dGVyICsgc2NhbGVfeF9sb2cxMCgpICsgc2NhbGVfeV9sb2cxMCgpICsgZ2d0aXRsZShwYXN0ZShuYW1lX3ksDQogICAgICAgICAgICAgICAgInZzLiIsbmFtZV94LCAiKGxvZyBzY2FsZSkiKSkNCiAgfQ0KDQogICMgQXJyYW5nZSBwbG90cw0KICBncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShoaXN0LCBzY2F0dGVyLCBuY29sPTIpDQp9DQoNCg0KIyBQbG90cw0KcGxvdF9oaXN0X3NjYXR0ZXIoQ08yLCBoaXN0X3Zhcj0iY28ycGVyY2FwIiwgIkdEUCIsICJjbzJwZXJjYXAiLCBuYW1lX2hpc3RfdmFyPSAiQ08yIHBlciBjYXAiLCBuYW1lX3g9IkdEUCIsIG5hbWVfeT0iQ08yIHBlciBjYXAiLCB1bml0X3g9IlsxayRdIiwgdW5pdF95PSJbdG9uc10iLCBiaW5zID0gMTAsIGxvZ19zY2FsZSA9IFRSVUUpDQoNCnBsb3RfaGlzdF9zY2F0dGVyKENPMiwgaGlzdF92YXI9IkdEUCIsICJHRFAiLCAiY28ycGVyY2FwIiwgbmFtZV9oaXN0X3Zhcj0iR0RQIiwgbmFtZV94PSJHRFAiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbMWskXSIsIHVuaXRfeT0iW3RvbnNdIiwgYmlucyA9IDEwKQ0KDQpwbG90X2hpc3Rfc2NhdHRlcihDTzIsIGhpc3RfdmFyPSJFbmVyZ3lVc2UiLCAiRW5lcmd5VXNlIiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9IkVuZXJneSBVc2UiLCBuYW1lX3g9IkVuZXJneSBVc2UiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbdG9ucyBvaWwgZXEuIHBlciBjYXBdIiwgdW5pdF95PSJbdG9uc10iLCBiaW5zID0gMTApDQoNCnBsb3RfaGlzdF9zY2F0dGVyKENPMiwgaGlzdF92YXI9InBvcCIsICJwb3AiLCAiY28ycGVyY2FwIiwgbmFtZV9oaXN0X3Zhcj0iUG9wdWxhdGlvbiIsIG5hbWVfeD0iUG9wdWxhdGlvbiIsIG5hbWVfeT0iQ08yIHBlciBjYXAiLCB1bml0X3g9IltNaWxsaW9uc10iLCB1bml0X3k9Ilt0b25zXSIsIGJpbnMgPSAxMCkNCg0KcGxvdF9oaXN0X3NjYXR0ZXIoQ08yLCBoaXN0X3Zhcj0iTG93Y2FyYm9uX2VuZXJneSIsICJMb3djYXJib25fZW5lcmd5IiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9Ikxvd2NhcmJvbiBlbmVyZ3kiLCBuYW1lX3g9Ikxvd2NhcmJvbiBlbmVyZ3kiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbJSBzdWIgZW5lcmd5XSIsIHVuaXRfeT0iW3RvbnNdIiwgYmlucyA9IDEwKQ0KDQpwbG90X2hpc3Rfc2NhdHRlcihDTzIsIGhpc3RfdmFyPSJ1cmIiLCAidXJiIiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9IlVyYmFuaXphdGlvbiIsIG5hbWVfeD0iVXJiYW5pemF0aW9uIiwgbmFtZV95PSJDTzIgcGVyIGNhcCIsIHVuaXRfeD0iWyVdIiwgdW5pdF95PSJbdG9uc10iLCBiaW5zID0gMTApDQoNCnBsb3RfaGlzdF9zY2F0dGVyKENPMiwgaGlzdF92YXI9ImludGVybmV0X3VzZXJzX3JhdGlvIiwgImludGVybmV0X3VzZXJzX3JhdGlvIiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9IkludGVybmV0IHVzZXJzIHJhdGlvIiwgbmFtZV94PSJJbnRlcm5ldCB1c2VycyByYXRpbyIsIG5hbWVfeT0iQ08yIHBlciBjYXAiLCB1bml0X3g9IlslXSIsIHVuaXRfeT0iW3RvbnNdIiwgYmlucyA9IDEwKQ0KYGBgDQoNCiMjIENvcnJlbGF0aW9uIEFuYWx5c2lzDQoNCkluIHRoaXMgc2VjdGlvbiwgd2UgZXhhbWluZSB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gdmFyaW91cyBjb3ZhcmlhdGVzLg0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBkYXRhIHJlbW92aW5nIHRoZSB1bnVzZWQgY292YXJpYXRlcw0KQ08yX3N1YnNldCA8LSBDTzJbLCBjKCJFbmVyZ3lVc2UiLCAiR0RQIiwgInBvcCIsICJjbzJwZXJjYXAiLCAiTG93Y2FyYm9uX2VuZXJneSIsICJ1cmIiLCAiaW50ZXJuZXRfdXNlcnNfcmF0aW8iKV0NCg0KaGVhZChDTzIpDQoNCiMgQm94cGxvdHM6DQpwYXIobWZyb3c9YygxLCAxKSwgcHR5PSJtIikNCmJveHBsb3Qoc2NhbGUoQ08yX3N1YnNldCksIGxhcz0zLCBtYWluPSJTdGFuZGFyZGl6ZWQgY292YXJpYXRlcyIsIGNleC5heGlzPTAuNzUpDQoNCiMgQ29ycmVsYXRpb24gbWF0cml4Og0KcGFyKG1mcm93PWMoMSwgMSksIHB0eT0icyIpDQppbWFnZSgxOm5jb2woQ08yX3N1YnNldCksIDE6bmNvbChDTzJfc3Vic2V0KSwgY29yKENPMl9zdWJzZXQpLA0KICAgICAgeGxhYj0iIiwgeWxhYj0iIiwgbWFpbj0iQ29ycmVsYXRpb24gYmV0d2VlbiBwcmVkaWN0b3JzIiwNCiAgICAgIGF4ZXM9RkFMU0UpDQpheGlzKDEsMTpuY29sKENPMl9zdWJzZXQpLCBjb2xuYW1lcyhDTzJfc3Vic2V0KSwgbGFzPTIsY2V4LmF4aXM9MC45KQ0KYXhpcygyLDE6bmNvbChDTzJfc3Vic2V0KSwgY29sbmFtZXMoQ08yX3N1YnNldCksIGxhcz0yLGNleC5heGlzPTAuOSkNCmBgYA0KDQpUaGUgZmVhdHVyZXMgd2l0aCB0aGUgaGlnaGVzdCBjb3JyZWxhdGlvbiB3aXRoIENPMiBlbWlzc2lvbnMgcGVyIGNhcGl0YSAoY28ycGVyY2FwKSBhcmUgRW5lcmd5VXNlLCBHRFAsIGFuZCBpbnRlcm5ldF91c2VyX3JhdGlvLg0KDQojIyAqU3Bpa2UgYW5kIHNsYWIgcHJpb3IqDQoNClRvIGRldGVybWluZSB0aGUgbW9zdCBpbXBhY3RmdWwgdmFyaWFibGVzIGZvciBvdXIgYW5hbHlzaXMsIGFuZCBwZXJmb3JtIHZhcmFpYmxlIHNlbGVjdGlvbiwgd2Ugd2lsbCBlbXBsb3kgYSBCYXllc2lhbiBhcHByb2FjaCB1c2luZyB0aGUgU3Bpa2UtYW5kLVNsYWIgcHJpb3Igb24gdGhlIG5vcm1hbGl6ZWQgZGF0YS4NCg0KVGhlIHNwaWtlICYgc2xhYiBwcmlvciBmb3IgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBpcw0KDQokJCBcYmVnaW57YWxpZ24qfSAgIA0KIFxiZXRhX2ogXG1pZCBcZ2FtbWFfaiAmXG92ZXJzZXR7aW5kfVxzaW0gKDEtXGdhbW1hX2opXCxcZGVsdGFfeygwKX0gKyBcZ2FtbWFfalwsXG1hdGhjYWx7Tn1cbGVmdCgwLCAgICAgXHNpZ21hXjJfe1xiZXRhX2p9XHJpZ2h0KSwgXFwgICANCiBcZ2FtbWFfaiBcbWlkIFx0aGV0YV9qICZcb3ZlcnNldHtpbmR9XHNpbSBcbWF0aGNhbHtCfWVcbGVmdChcdGhldGFfalxyaWdodCksIFxcWzVwdF0gICANCiBcdGhldGFfe2p9ICZcb3ZlcnNldHtpaWR9XHNpbSBwXGxlZnQoXHRoZXRhX2pccmlnaHQpLCBcZW5ke2FsaWduKn0gDQokJA0KDQp3aGVyZSAkXHRoZXRhX2okIGlzIGEgcHJvYmFiaWxpdHkgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyICRcYmV0YV9qJCBpcyBub256ZXJvIGFuZCBoZW5jZSB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGNvdmFyaWF0ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhbmQgJFxzaWdtYV4yX3tcYmV0YV9qfSA9IDEkLg0KDQpgYGB7cn0NCmxpYnJhcnkocmphZ3MpDQoNCmhlYWQoQ08yX3N1YnNldCkNCiMgU3Bpa2UgYW5kIHNsYWIgbW9kZWwNCmBgYA0KDQpgYGB7cn0NCm1vZGVsX3N0cmluZyA9IHRleHRDb25uZWN0aW9uKA0KIm1vZGVsIHsNCiAgIyBMaWtlbGlob29kIA0KICBmb3IgKGkgaW4gMTpOKSB7DQogIAlZW2ldIH4gZG5vcm0oYmV0YTAgKyBpbnByb2QoWFtpLF0sIGJldGFbXSksIGludi52YXIueSkNCiAgfQ0KICANCiAgIyBQcmlvcnMNCiAgaW52LnZhci55IH4gZGdhbW1hKDAuMDEsIDAuMDEpDQogIGJldGEwIH4gZG5vcm0oMCwgMC4wMDEpDQogIA0KICBmb3IoaiBpbiAxOlApIHsNCiAgCWludl92YXJfYmV0YVtqXSA9IDEgLyB2YXJfYmV0YVtqXQ0KICB9DQoNCiAgZm9yKGogaW4gMTpQKSB7DQogICAgYmV0YVtqXSA9IGdbal0gKiBiZXRhVGVtcFtqXQ0KICAgIGJldGFUZW1wW2pdIH4gZG5vcm0oMCwgaW52X3Zhcl9iZXRhW2pdKQ0KICANCiAgCWdbal0gfiBkYmVybih0aGV0YVtqXSkgICAgICAgICAgICAgICAgICAgICANCiAgCXRoZXRhW2pdIH4gZHVuaWYoMCwgMSkNCiAgfQ0KICANCn0iKQ0KDQoNCiMgTW9kZWwgc2V0dGluZ3M6DQpZID0gQ08yX3N1YnNldCRjbzJwZXJjYXANCg0KIyBXZSBzdGFuZGFyZGlzZSB0aGUgZGF0YSB0byBoZWxwIHRoZSBhbGdvcml0aG0NClggPSB3aXRoaW4oQ08yX3N1YnNldCwgcm0oImNvMnBlcmNhcCIpKQ0KWF9ub3JtID0gc2NhbGUoWCkgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFuZGFyZGl6YXRpb24gc3RlcA0KUCA9IG5jb2woWCkNCk4gPSBucm93KFgpDQoNCiMgRGF0YToNCnZhcl9iZXRhPXJlcCgxLCBQKQ0KZGF0YUxpc3QgPSBsaXN0KFk9WSwgWD1YX25vcm0sIHZhcl9iZXRhPXZhcl9iZXRhLCBOPU4sIFA9UCkNCg0KDQojIFNwZWNpZnkgdGhlIGluaXRpYWwgdmFsdWVzOg0KaW5pdHMgPSBsaXN0KGJldGEwPTAsIGJldGFUZW1wPXJlcCgwLFApLCBnPXJlcCgwLFApLCB0aGV0YT1yZXAoMC41LFApKQ0KDQoNCiMgSmFncyAyDQpzYW1wbGVzIDwtIGphZ3MobW9kZWwuZmlsZSA9IG1vZGVsX3N0cmluZywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YUxpc3QsDQogICAgICAgICAgICAgICAgICAgICAjIGluaXRzPWluaXRzLA0KICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50by5zYXZlPSBjKCJiZXRhMCIsICJiZXRhIiwgImciKSwNCiAgICAgICAgICAgICAgICAgICAgIG4uYWRhcHQ9MTAwMCwgbi5pdGVyPTIwMDAwLCBuLmNoYWlucyA9IDMsIG4uYnVybmluID0gNTAwMCwNCiAgICAgICAgICAgICAgICAgICAgIG4udGhpbiA9IDIpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KIyBPdXRwdXQNCnNhbXBsZXMNCg0KDQojIFRyYWNlIGFuZCBkZW5zaXR5DQojIGJldGEwDQpwbG90KHNhbXBsZXMkc2FtcGxlc1ssYygnYmV0YTAnKV0sIG1haW49InBvc3RlcmlvciBiZXRhMCIpDQoNCiMgYmV0YVtpXQ0KZm9yKGsgaW4gMTpQKXsNCiAgcGFyYW1fbmFtZSA8LSBwYXN0ZTAoImJldGFbIiwgaywgIl0iKSAgIyBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlciBuYW1lIGR5bmFtaWNhbGx5DQogIHBsb3Qoc2FtcGxlcyRzYW1wbGVzWywgcGFyYW1fbmFtZV0sIG1haW4gPSBwYXN0ZSgiUG9zdGVyaW9yIG9mIiwgcGFyYW1fbmFtZSkpDQp9DQoNCiMgZ1tpXQ0KZm9yKGsgaW4gMTpQKXsNCiAgcGFyYW1fbmFtZSA8LSBwYXN0ZTAoImdbIiwgaywgIl0iKSAgIyBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlciBuYW1lIGR5bmFtaWNhbGx5DQogIHBsb3Qoc2FtcGxlcyRzYW1wbGVzWywgcGFyYW1fbmFtZV0sIG1haW4gPSBwYXN0ZSgiUG9zdGVyaW9yIG9mIiwgcGFyYW1fbmFtZSkpDQp9DQpgYGANCg0KSGVyZSB3ZSBjYW4gdmlzdWFsaXplIHRoZSAqKnBvc3RlcmlvciBwcm9iYWJpbGl0eSBvZiBpbmNsdXNpb24qKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwb3N0ZXJpb3IgbWVhbiBvZiB0aGUgJFxnYW1tYV9qJCwgd2hpY2ggYXJlIGNhbGxlZCAqKmBnYCoqIGluIHRoZSBjb2RlLg0KDQpgYGB7cn0NCnNzID0gc3VtbWFyeShzYW1wbGVzKQ0KcG9zdF9tZWFuX2cgPSBzc1s4OjEzLCAibWVhbiJdDQpwb3N0X21lYW5fZyANCg0KYGBgDQoNCldlIGNhbiB2aXN1YWxpemUgdGhlbSB3aXRoIGEgbmljZSBjaGFydC4NCg0KYGBge3J9DQojIExvYWQgdGhlIGxpYnJhcnk6DQpsaWJyYXJ5KGdncGxvdDIpDQoNCnBvc3RtZWFuZ19kZiA9IGRhdGEuZnJhbWUodmFsdWU9cG9zdF9tZWFuX2csIHZhcj1jb2xuYW1lcyhYKSkNCnAxID0gZ2dwbG90KGRhdGE9cG9zdG1lYW5nX2RmLCBhZXMoeT12YWx1ZSx4PXZhcixmaWxsPXZhcikpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyANCiAgZ2VvbV9obGluZShtYXBwaW5nPWFlcyh5aW50ZXJjZXB0PTAuNSksIGNvbD0yLCBsd2Q9MS4xKSArDQogIGNvb3JkX2ZsaXAoKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsgDQogIHlsYWIoIlBvc3RlcmlvciBpbmNsdXNpb24gcHJvYmFiaWxpdGllcyIpICsgeGxhYigiIikNCnAxDQpgYGANCg0KVGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBvZiBpbmNsdXNpb24gcGxvdCByZXZlYWxzIHNvbWUgaW50ZXJlc3RpbmcgcmVzdWx0cy4gVGhlIG1vZGVsIHNob3dzIGEgc3Ryb25nIHByZWZlcmVuY2UsIGFzc2lnbmluZyBhIHByb2JhYmlsaXR5IG9mIDEgdG8gTG93Y2FyYm9uX2VuZXJneSwgR0RQLCBhbmQgRW5lcmd5VXNlLCB3aGlsZSBhc3NpZ25pbmcgbmVhci16ZXJvIHByb2JhYmlsaXRpZXMgdG8gdXJiYW5pemF0aW9uLCBwb3B1bGF0aW9uLCBhbmQgaW50ZXJuZXRfdXNlcl9yYXRpby4NCg0KVGhlc2UgcmVzdWx0cyBhcmUgaW50ZXJlc3RpbmcuIFdoaWxlIHRoZSBoaWdoIGluY2x1c2lvbiBwcm9iYWJpbGl0aWVzIGZvciBHRFAgYW5kIEVuZXJneVVzZSBhcmUgY29uc2lzdGVudCB3aXRoIHRoZWlyIHN0cm9uZyBjb3JyZWxhdGlvbiB3aXRoIGNvMnBlcmNhcCwgdGhlIGhpZ2ggcHJvYmFiaWxpdHkgZm9yICoqTG93Y2FyYm9uX2VuZXJneSoqIGlzIHN1cnByaXNpbmcgZ2l2ZW4gaXRzICoqbG93IGNvcnJlbGF0aW9uKiogd2l0aCBjbzJwZXJjYXAuDQoNCmBgYHtyfQ0KcGxvdF9oaXN0X3NjYXR0ZXIoQ08yLCBoaXN0X3Zhcj0iY28ycGVyY2FwIiwgIkdEUCIsICJjbzJwZXJjYXAiLCBuYW1lX2hpc3RfdmFyPSAiQ08yIHBlciBjYXAiLCBuYW1lX3g9IkdEUCIsIG5hbWVfeT0iQ08yIHBlciBjYXAiLCB1bml0X3g9IlsxayRdIiwgdW5pdF95PSJbdG9uc10iLCBiaW5zID0gMTAsIGxvZ19zY2FsZSA9IFRSVUUpDQoNCnBsb3RfaGlzdF9zY2F0dGVyKENPMiwgaGlzdF92YXI9IkdEUCIsICJHRFAiLCAiY28ycGVyY2FwIiwgbmFtZV9oaXN0X3Zhcj0iR0RQIiwgbmFtZV94PSJHRFAiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbMWskXSIsIHVuaXRfeT0iW3RvbnNdIiwgYmlucyA9IDEwKQ0KDQpwbG90X2hpc3Rfc2NhdHRlcihDTzIsIGhpc3RfdmFyPSJFbmVyZ3lVc2UiLCAiRW5lcmd5VXNlIiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9IkVuZXJneSBVc2UiLCBuYW1lX3g9IkVuZXJneSBVc2UiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbdG9ucyBvaWwgZXEuIHBlciBjYXBdIiwgdW5pdF95PSJbdG9uc10iLCBiaW5zID0gMTAsIGxvZ19zY2FsZSA9IFRSVUUpDQoNCnBsb3RfaGlzdF9zY2F0dGVyKENPMiwgaGlzdF92YXI9IkVuZXJneVVzZSIsICJFbmVyZ3lVc2UiLCAiY28ycGVyY2FwIiwgbmFtZV9oaXN0X3Zhcj0iRW5lcmd5IFVzZSIsIG5hbWVfeD0iRW5lcmd5IFVzZSIsIG5hbWVfeT0iQ08yIHBlciBjYXAiLCB1bml0X3g9Ilt0b25zIG9pbCBlcS4gcGVyIGNhcF0iLCB1bml0X3k9Ilt0b25zXSIsIGJpbnMgPSAxMCkNCg0KcGxvdF9oaXN0X3NjYXR0ZXIoQ08yLCBoaXN0X3Zhcj0iTG93Y2FyYm9uX2VuZXJneSIsICJMb3djYXJib25fZW5lcmd5IiwgImNvMnBlcmNhcCIsIG5hbWVfaGlzdF92YXI9Ikxvd2NhcmJvbiBlbmVyZ3kiLCBuYW1lX3g9Ikxvd2NhcmJvbiBlbmVyZ3kiLCBuYW1lX3k9IkNPMiBwZXIgY2FwIiwgdW5pdF94PSJbJSBzdWIgZW5lcmd5XSIsIHVuaXRfeT0iW3RvbnNdIiwgYmlucyA9IDEwKQ0KDQoNCiMgUG9zdGVyaW9yIG1lYW5zIG9mIHRoZSBiZXRhcw0KcG9zdF9tZWFuX2IgPSBzc1tjKDIsIDMsIDUpLCAibWVhbiJdDQpwb3N0X21lYW5fYiANCmBgYA0KDQpUaGUgYmV0YSBwYXJhbWV0ZXJzIGZvciBib3RoIEdEUCBhbmQgRW5lcmd5VXNlIHBlciBjYXBpdGEgYXJlIHBvc2l0aXZlLCBpbmRpY2F0aW5nIGEgcG9zaXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCB3aXRoIGNvMnBlcmNhcCwgd2hpY2ggaXMgY29uZmlybWVkIGJ5IHRoZSBwbG90cy4NCg0KRm9yIExvd2NhcmJvbl9lbmVyZ3ksIHRoZSBwb3N0ZXJpb3IgbWVhbiBvZiB0aGUgYmV0YSBwYXJhbWV0ZXIgaXMgbmVnYXRpdmUsIHN1Z2dlc3RpbmcgYSBuZWdhdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwLiBUaGlzIHJlc3VsdCBpcyBub3QgaW1tZWRpYXRlbHkgZXZpZGVudCBmcm9tIHRoZSBwbG90LCBhcyB0aGUgZGF0YSBkb2VzIG5vdCBhcHBlYXIgdG8gZm9sbG93IGEgY2xlYXIgbmVnYXRpdmUgbGluZWFyIHRyZW5kLiBIb3dldmVyLCB0aGUgcmVzdWx0IGlzIGludHVpdGl2ZWx5IHBsYXVzaWJsZTogY291bnRyaWVzIHdpdGggYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBMb3djYXJib25fZW5lcmd5IHRlbmQgdG8gcHJvZHVjZSBsZXNzIENPMi4NCg0KIyMgQmF5ZXNpYW4gcmVncmVzc2lvbnMNCg0KRnJvbSBub3cgb24gd2Ugd2lsbCBjb250aW51ZSBvdXIgYW5hbHlzaXMgYnkgZm9jdXNpbmcgb24gdGhlIGNvdmFyaWF0ZXMgR0RQLCBFbmVyZ3lVc2UgYW5kIExvd2NhcmJvbiBFbmVyZ3kuDQoNCiMjIyBHRFAgYW5kIENPMiBFbWlzc2lvbnMNCg0KTmV4dCwgd2UgYW5hbHl6ZSB0aGUgZGlyZWN0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIENPMiBlbWlzc2lvbnMgYW5kIEdEUC4NCg0KV2UgcGVyZm9ybSB0aGUgcmVncmVzc2lvbiBvbiB0aGUgbG9nIHNjYWxlIGZvciBiZXR0ZXIgaW50ZXJwcmV0YWJpbGl0eSBvZiB0aGUgZGF0YS4NCg0KVGhlIG1vZGVsIGlzIGFzIGZvbGxvdzokJA0KXGJlZ2lue3NwbGl0fQ0KJiAgWV9pIFxzaW0gXG1hdGhjYWx7Tn0oXGFscGhhKyBYX2kgXGJldGEsXHNpZ21hXjIpIFxcDQomIFxhbHBoYSBcc2ltIFxtYXRoY2Fse059KDAsMTAwKSBcXA0KJiBcYmV0YSBcc2ltIFxtYXRoY2Fse059KDAsIDEwMClcXA0KJiBcZnJhY3sxfXtcc2lnbWFeezJ9fSBcc2ltIFxtYXRoY2Fse0d9KDAuMDAxLDAuMDAxKSAgXFwNClxlbmR7c3BsaXR9DQokJA0KDQpgYGB7cn0NCiMgbW9kZWwNCm1vZGVsMSA8LSB0ZXh0Q29ubmVjdGlvbigibW9kZWx7DQogICMgbGlrZWxpaG9vZA0KCWZvciAoaSBpbiAxOk4pIHsNCgkJWVtpXSB+IGRub3JtKG11W2ldLCBpbnYudmFyKQ0KCQltdVtpXSA9IGFscGhhICsgWFtpXSAqIGJldGENCgl9DQoJDQoJIyBwcmlvciANCglhbHBoYSB+IGRub3JtKDAsIC4wMSkNCgliZXRhIH4gZG5vcm0oMCwgLjAxKQ0KCWludi52YXIgfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKQ0KCXNpZ21hMiA8LSAxL2ludi52YXINCn0iKQ0KDQoNCiMgRGF0YQ0KIyBZID0gQ08yX3N1YnNldCRjbzJwZXJjYXANCiMgWCA9IENPMl9zdWJzZXQkR0RQDQpZID0gbG9nKENPMl9zdWJzZXQkY28ycGVyY2FwKSAgICAgICAgICMgbG9nDQpYID0gbG9nKENPMl9zdWJzZXQkR0RQKQ0KDQpkYXRhTGlzdCA9IGxpc3QoWT1ZLCBYPVgsIE49bGVuZ3RoKFkpKQ0KDQoNCiMgSmFncyANCnNhbXBsZXMxIDwtIGphZ3MobW9kZWwuZmlsZSA9IG1vZGVsMSwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YUxpc3QsDQogICAgICAgICAgICAgICAgICAgICAjIGluaXRzPWluaXRzLA0KICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50by5zYXZlPSBjKCJhbHBoYSIsICJiZXRhIiwgInNpZ21hMiIsICJtdSIpLA0KICAgICAgICAgICAgICAgICAgICAgbi5hZGFwdD0xMDAwLCBuLml0ZXI9MjAwMDAsIG4uY2hhaW5zID0gMiwgbi5idXJuaW4gPSAyMDAwLA0KICAgICAgICAgICAgICAgICAgICAgbi50aGluID0gMikNCmBgYA0KDQpgYGB7cn0NCiMgT3V0cHV0DQpzYW1wbGVzMQ0KDQojIFRyYWNlIGFuZCBkZW5zaXR5DQpwbG90KHNhbXBsZXMxJHNhbXBsZXNbLGMoJ2FscGhhJyldLCBtYWluPSJwb3N0ZXJpb3IgYWxwaGEiKQ0KcGxvdChzYW1wbGVzMSRzYW1wbGVzWyxjKCdiZXRhJyldLCBtYWluPSJwb3N0ZXJpb3IgYmV0YSIpDQpwbG90KHNhbXBsZXMxJHNhbXBsZXNbLGMoJ3NpZ21hMicpXSwgbWFpbj0icG9zdGVyaW9yIHNpZ21hMiIpDQoNCg0KDQojIEF1dG9jb3JyZWxhdGlvbg0KIyBhdXRvY29yci5wbG90KHNhbXBsZXMxJHNhbXBsZXNbLGMoJ2FscGhhJyldLCBtYWluPSJBQ0YgYWxwaGEiKQ0KIyBhdXRvY29yci5wbG90KHNhbXBsZXMkc2FtcGxlc1ssYygnYmV0YScpXSwgbWFpbj0iQUNGIGJldGEiKQ0KIyBhdXRvY29yci5wbG90KHNhbXBsZXMkc2FtcGxlc1ssYygnc2lnbWEyJyldLCBtYWluPSJBQ0Ygc2lnbWEyIikNCmBgYA0KDQpgYGB7cn0NCiMgUGxvdHRpbmcgdGhlIGRhdGEgYnkgY291bnRyeQ0KcGxvdChYLCBZLA0KICAgICB4bGFiID0gIkdEUCBbMWskXSIsIHlsYWIgPSAiQ08yIHBlciBjYXBpdGEgW3RvbnNdIiwgDQogICAgIG1haW4gPSAiQ08yIHBlciBjYXBpdGEgdnMgR0RQIChsb2cgc2NhbGUpIiwNCiAgICAgcGNoID0gMjAsDQogICAgIGNleCA9IDEsDQogICAgIGNvbCA9ICJibGFjayIsDQogICAgIHhheHQgPSAnbicsICAjIHN1cHByZXNzIGRlZmF1bHQgeC1heGlzDQogICAgIHlheHQgPSAnbicgICMgc3VwcHJlc3MgZGVmYXVsdCB4LWF4aXMNCiAgICAgKQ0KDQojIEFkZGluZyBjdXN0b20geC1heGlzIGxhYmVscw0KbmV3X2xhYmVsc194IDwtIGMoMTBeMSwgMTBeMiwgMTBeMywgMTBeNCkNCmF4aXMoMSwgYXQgPSBzZXFfYWxvbmcobmV3X2xhYmVsc194KSwgbGFiZWxzID0gbmV3X2xhYmVsc194KQ0KDQojIEFkZGluZyBjdXN0b20geS1heGlzIGxhYmVscw0KbmV3X2xhYmVsc195IDwtIGMoMTBeLTEsIDEwXjAsIDEwXjEsIDEwXjIsIDEwXjMpDQpheGlzKDIsIGF0ID0gc2VxX2Fsb25nKG5ld19sYWJlbHNfeSkgLSAyLCBsYWJlbHMgPSBuZXdfbGFiZWxzX3kpDQoNCg0KDQojIFJlY292ZXJpbmcgYWxwaGEgYW5kIGJldGENCnNzID0gc3VtbWFyeShzYW1wbGVzMSkNCiMgQWxwaGENCmFscGhhX21lYW4gPSBzc1siYWxwaGEiLCAibWVhbiJdDQphbHBoYV9xMSA9IHNzWyJhbHBoYSIsICIyLjUlIl0NCmFscGhhX3EyID0gc3NbImFscGhhIiwgIjk3LjUlIl0NCiMgQmV0YQ0KYmV0YV9tZWFuID0gc3NbImJldGEiLCAibWVhbiJdDQpiZXRhX3ExID0gc3NbImJldGEiLCAiMi41JSJdDQpiZXRhX3EyID0gc3NbImJldGEiLCAiOTcuNSUiXQ0KDQojIEFkZCBhIGdyYXkgYmFja2dyb3VuZA0KcmVjdChwYXIoInVzciIpWzFdLCBwYXIoInVzciIpWzNdLCBwYXIoInVzciIpWzJdLCBwYXIoInVzciIpWzRdLCBjb2wgPSAiZ3JheTkwIiwgYm9yZGVyID0gTkEpDQpwYW5lbC5maXJzdCA9IGdyaWQoY29sID0gIndoaXRlIiwgbHR5ID0gImRvdHRlZCIpDQpwb2ludHMoWCwgWSwgcGNoID0gMjAsIGNleCA9IDEsIGNvbCA9ICJibGFjayIpDQoNCiMgTGluZXMNCmFibGluZShhID0gYWxwaGFfbWVhbiwgYiA9IGJldGFfbWVhbiwgY29sID0gInJlZCIsIGx3ZCA9IDMpDQphYmxpbmUoYSA9IGFscGhhX3ExLCBiID0gYmV0YV9xMSwgY29sID0gInJlZCIsIGx0eT0yLCBsd2QgPSAzKQ0KYWJsaW5lKGEgPSBhbHBoYV9xMiwgYiA9IGJldGFfcTIsIGNvbCA9ICJyZWQiLCBsdHk9MiwgbHdkID0gMykNCg0KIyBsZWdlbmQNCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZD1jKCIyLjUlIiwgIjk3LjUlIiksIGNvbD1jKCJyZWQiLCAicmVkIiksIGx0eT0zLCBsd2QgPSAzLA0KICAgICAgIGNleD0wLjgpDQpgYGANCg0KYGBge3J9DQojIGdncGxvdCB2ZXJzaW9uIChpZ25vcmFyZSkNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgUGxvdA0KZ19iYXllcyA9IGdncGxvdChkYXRhPUNPMl9zdWJzZXQsIGFlcyh4PWxvZyhHRFApLCB5PWxvZyhjbzJwZXJjYXApKSkgKyANCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gYWxwaGFfbWVhbiwgc2xvcGUgPSBiZXRhX21lYW4sIGNvbG9yID0gInJlZCIsIA0KICAgICAgICAgICAgICBsaW5ld2lkdGggPSAxKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGFscGhhX3ExLCBzbG9wZSA9IGJldGFfcTEsIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gYWxwaGFfcTIsIHNsb3BlID0gYmV0YV9xMiwgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT0iQ3VydmVzIiwgdmFsdWVzPWMoJ2JsdWUnLCdyZWQnKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSJCYW5kcyIsIHZhbHVlcz0nYmx1ZScpDQoNCiMgZ19iYXllcw0KICANCmBgYA0KDQpBcyB3ZSBjYW4gc2VlIGZyb20gdGhlIHBsb3QsIHRoZXJlIGlzIGEgY2xlYXIgcG9zaXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEdEUCBhbmQgQ08yIGVtaXNzaW9ucyBwZXIgY2FwaXRhLg0KDQpUaGlzIGZpbmRpbmcgYWxpZ25zIHdpdGggdGhlIGFuYWx5c2lzIHBlcmZvcm1lZCBvbiAqKkRhdGFzZXQgMSoqLCBleHBsYWluaW5nIHdoeSBlY29ub21pYyAqKnJlY2Vzc2lvbnMqKiB0ZW5kIHRvIHJlZHVjZSBDTzIgZW1pc3Npb24gaW50ZW5zaXR5LCB3aGVyZWFzIHBlcmlvZHMgb2YgKiplY29ub21pYyBncm93dGgqKiBjb3JyZXNwb25kIHdpdGggYSBtb3JlIHJhcGlkIGluY3JlYXNlIGluIGVtaXNzaW9ucy4NCg0KIyMjIEVuZXJneSBVc2UgYW5kIENPMiBFbWlzc2lvbnMNCg0KV2UgYWxzbyBhbmFseXplIHRoZSBkaXJlY3QgcmVsYXRpb25zaGlwIGJldHdlZW4gQ08yIGVtaXNzaW9ucyBhbmQgRW5lcmd5IFVzZS4NCg0KQWdhaW4sIHdlIHBlcmZvcm0gdGhlIHJlZ3Jlc3Npb24gb24gdGhlIGxvZyBzY2FsZSBmb3IgYmV0dGVyIGludGVycHJldGFiaWxpdHkuDQoNClRoZSBtb2RlbCBpcyBhcyBmb2xsb3c6JCQNClxiZWdpbntzcGxpdH0NCiYgIFlfaSBcc2ltIFxtYXRoY2Fse059KFxhbHBoYSsgWF9pIFxiZXRhLFxzaWdtYV4yKSBcXA0KJiBcYWxwaGEgXHNpbSBcbWF0aGNhbHtOfSgwLDEwMCkgXFwNCiYgXGJldGEgXHNpbSBcbWF0aGNhbHtOfSgwLCAxMDApXFwNCiYgXGZyYWN7MX17XHNpZ21hXnsyfX0gXHNpbSBcbWF0aGNhbHtHfSgwLjAwMSwwLjAwMSkgIFxcDQpcZW5ke3NwbGl0fQ0KJCQNCg0KYGBge3J9DQojIG1vZGVsDQptb2RlbDIgPC0gdGV4dENvbm5lY3Rpb24oIm1vZGVsew0KICAjIGxpa2VsaWhvb2QNCglmb3IgKGkgaW4gMTpOKSB7DQoJCVlbaV0gfiBkbm9ybShtdVtpXSwgaW52LnZhcikNCgkJbXVbaV0gPSBhbHBoYSArIFhbaV0gKiBiZXRhDQoJfQ0KCQ0KCSMgcHJpb3IgDQoJYWxwaGEgfiBkbm9ybSgwLCAuMDEpDQoJYmV0YSB+IGRub3JtKDAsIC4wMSkNCglpbnYudmFyIH4gZGdhbW1hKDAuMDAxLCAwLjAwMSkNCglzaWdtYTIgPC0gMS9pbnYudmFyDQp9IikNCg0KDQojIERhdGENCiMgWSA9IENPMl9zdWJzZXQkY28ycGVyY2FwDQojIFggPSBDTzJfc3Vic2V0JEVuZXJneVVzZQ0KWSA9IGxvZyhDTzJfc3Vic2V0JGNvMnBlcmNhcCkgICAgICAgICAjIGxvZw0KWCA9IGxvZyhDTzJfc3Vic2V0JEVuZXJneVVzZSkNCg0KZGF0YUxpc3QgPSBsaXN0KFk9WSwgWD1YLCBOPWxlbmd0aChZKSkNCg0KDQojIEphZ3MgDQpzYW1wbGVzMiA8LSBqYWdzKG1vZGVsLmZpbGUgPSBtb2RlbDIsDQogICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGFMaXN0LA0KICAgICAgICAgICAgICAgICAgICAgIyBpbml0cz1pbml0cywNCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudG8uc2F2ZT0gYygiYWxwaGEiLCAiYmV0YSIsICJzaWdtYTIiLCAibXUiKSwNCiAgICAgICAgICAgICAgICAgICAgIG4uYWRhcHQ9MTAwMCwgbi5pdGVyPTIwMDAwLCBuLmNoYWlucyA9IDIsIG4uYnVybmluID0gMjAwMCwNCiAgICAgICAgICAgICAgICAgICAgIG4udGhpbiA9IDIpDQpgYGANCg0KYGBge3J9DQojIE91dHB1dA0Kc2FtcGxlczINCg0KIyBUcmFjZSBhbmQgZGVuc2l0eQ0KcGxvdChzYW1wbGVzMiRzYW1wbGVzWyxjKCdhbHBoYScpXSwgbWFpbj0icG9zdGVyaW9yIGFscGhhIikNCnBsb3Qoc2FtcGxlczIkc2FtcGxlc1ssYygnYmV0YScpXSwgbWFpbj0icG9zdGVyaW9yIGJldGEiKQ0KcGxvdChzYW1wbGVzMiRzYW1wbGVzWyxjKCdzaWdtYTInKV0sIG1haW49InBvc3RlcmlvciBzaWdtYTIiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQbG90dGluZyB0aGUgZGF0YSBieSBjb3VudHJ5DQpwbG90KFgsIFksDQogICAgIHhsYWIgPSAiRW5lcmd5IFVzZSBbdG9ucyBvaWwgZXEuIHBlciBjYXBdIiwgeWxhYiA9ICJDTzIgcGVyIGNhcGl0YSBbdG9uc10iLCANCiAgICAgbWFpbiA9ICJDTzIgcGVyIGNhcGl0YSB2cyBFbmVyZ3kgVXNlIChsb2cgc2NhbGUpIiwNCiAgICAgcGNoID0gMjAsDQogICAgIGNleCA9IDEsDQogICAgIGNvbCA9ICJibGFjayIsDQogICAgIHhheHQgPSAnbicsICAjIHN1cHByZXNzIGRlZmF1bHQgeC1heGlzDQogICAgIHlheHQgPSAnbicgICMgc3VwcHJlc3MgZGVmYXVsdCB4LWF4aXMNCiAgICAgKQ0KDQojICMgQWRkaW5nIGN1c3RvbSB4LWF4aXMgbGFiZWxzDQpuZXdfbGFiZWxzX3ggPC0gYygxMF4xLCAxMF4yLCAxMF4zLCAxMF40LCAxMF41KQ0KYXhpcygxLCBhdCA9IHNlcV9hbG9uZyhuZXdfbGFiZWxzX3gpLCBsYWJlbHMgPSBuZXdfbGFiZWxzX3gpDQojIA0KIyAjIEFkZGluZyBjdXN0b20geS1heGlzIGxhYmVscw0KbmV3X2xhYmVsc195IDwtIGMoMTBeLTEsIDEwXjAsIDEwXjEsIDEwXjIsICIxZTMiKQ0KYXhpcygyLCBhdCA9IHNlcV9hbG9uZyhuZXdfbGFiZWxzX3kpIC0gMiwgbGFiZWxzID0gbmV3X2xhYmVsc195KQ0KDQoNCg0KIyBSZWNvdmVyaW5nIGFscGhhIGFuZCBiZXRhDQpzcyA9IHN1bW1hcnkoc2FtcGxlczIpDQojIEFscGhhDQphbHBoYV9tZWFuID0gc3NbImFscGhhIiwgIm1lYW4iXQ0KYWxwaGFfcTEgPSBzc1siYWxwaGEiLCAiMi41JSJdDQphbHBoYV9xMiA9IHNzWyJhbHBoYSIsICI5Ny41JSJdDQojIEJldGENCmJldGFfbWVhbiA9IHNzWyJiZXRhIiwgIm1lYW4iXQ0KYmV0YV9xMSA9IHNzWyJiZXRhIiwgIjIuNSUiXQ0KYmV0YV9xMiA9IHNzWyJiZXRhIiwgIjk3LjUlIl0NCg0KIyBBZGQgYSBncmF5IGJhY2tncm91bmQNCnJlY3QocGFyKCJ1c3IiKVsxXSwgcGFyKCJ1c3IiKVszXSwgcGFyKCJ1c3IiKVsyXSwgcGFyKCJ1c3IiKVs0XSwgY29sID0gImdyYXk5MCIsIGJvcmRlciA9IE5BKQ0KcGFuZWwuZmlyc3QgPSBncmlkKGNvbCA9ICJ3aGl0ZSIsIGx0eSA9ICJkb3R0ZWQiKQ0KcG9pbnRzKFgsIFksIHBjaCA9IDIwLCBjZXggPSAxLCBjb2wgPSAiYmxhY2siKQ0KDQojIExpbmVzDQphYmxpbmUoYSA9IGFscGhhX21lYW4sIGIgPSBiZXRhX21lYW4sIGNvbCA9ICJyZWQiLCBsd2QgPSAzKQ0KYWJsaW5lKGEgPSBhbHBoYV9xMSwgYiA9IGJldGFfcTEsIGNvbCA9ICJyZWQiLCBsdHk9MiwgbHdkID0gMykNCmFibGluZShhID0gYWxwaGFfcTIsIGIgPSBiZXRhX3EyLCBjb2wgPSAicmVkIiwgbHR5PTIsIGx3ZCA9IDMpDQoNCiMgbGVnZW5kDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiMi41JSIsICI5Ny41JSIpLCBjb2w9YygicmVkIiwgInJlZCIpLCBsdHk9MywgbHdkID0gMywNCiAgICAgICBjZXg9MC44KQ0KYGBgDQoNClRoZSBhbmFseXNpcyByZXZlYWxzIGEgc3Ryb25nIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBFbmVyZ3kgVXNlIGFuZCBDTzIgZW1pc3Npb25zIHBlciBjYXBpdGEuDQoNCkhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGRhdGEgcG9pbnRzIHRoYXQgYXBwZWFyIHRvIGJlIG91dGxpZXJzLiBXaGlsZSB0aGVzZSBvdXRsaWVycyBhcmUgbGVzcyBldmlkZW50IGluIHRoZSBsb2cgcGxvdCwgdGhleSBiZWNvbWUgbW9yZSBub3RpY2VhYmxlIHdoZW4gcGxvdHRlZCBvbiB0aGUgcmVhbCBzY2FsZS4NCg0KYGBge3J9DQojIFBsb3R0aW5nIHRoZSBkYXRhIGJ5IGNvdW50cnkNCnBsb3QoQ08yJEVuZXJneVVzZSwgQ08yJGNvMnBlcmNhcCwgDQogICAgIHhsYWIgPSAiRW5lcmd5IFVzZSBbdG9ucyBvaWwgZXEuIHBlciBjYXBdIiwgeWxhYiA9ICJDTzIgcGVyIGNhcGl0YSBbdG9uc10iLCANCiAgICAgIyBsb2cgPSAieHkiLCANCiAgICAgY29sID0gcGFsZXR0ZV9jb2xvcnNbYXMubnVtZXJpYyhmYWN0b3IoQ08yJGNvdW50cnkpKV0NCiAgICAgKQ0KDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9IkVhY2ggY29sb3VyIHJlcHJlc2VudHMgYSBjb3VudHJ5IiwgY2V4PTAuNykNCg0KDQojIFNlbGVjdGluZyB0aGUgb3V0bGllciBjb3VudHJ5DQojIFN1YnNldCB0aGUgZGF0YQ0Kc2VsZWN0ZWRfY291bnRyaWVzIDwtIHN1YnNldChDTzIsIGNvMnBlcmNhcCA8IDIwICYgRW5lcmd5VXNlID4gMTAwKQ0KDQojIFZpZXcgdGhlIHNlbGVjdGVkIGNvdW50cmllcw0KY291bnRyaWVzID0gdW5pcXVlKHNlbGVjdGVkX2NvdW50cmllcyRjb3VudHJ5KQ0KDQpzZWxlY3RlZF9jb3VudHJpZXMNCmNvdW50cmllcw0KYGBgDQoNClVwb24gY2xvc2VyIGluc3BlY3Rpb24sIHRoZSBvbmx5IG91dGxpZXIgaXMgSWNlbGFuZC4NCg0KSWNlbGFuZCdzIHJlbGF0aXZlbHkgbG93IENPMiBlbWlzc2lvbnMgY2FuIGJlIGF0dHJpYnV0ZWQgdG8gaXRzIHN1YnN0YW50aWFsIHVzZSBvZiBsb3ctY2FyYm9uIGVuZXJneSBzb3VyY2VzLCB3aGljaCBhY2NvdW50ZWQgZm9yIHVwIHRvIDgwJSBvZiBpdHMgZW5lcmd5IHByb2R1Y3Rpb24gaW4gMjAwOS4NCg0KIyMjIExvdyBjYXJib24gRW5lcmd5DQoNCkxvdy1jYXJib24gZW5lcmd5IGlzIGRlDGZpbmVkIGFzIHRoZSBzdW0gb2YgbnVjbGVhciBhbmQgcmVuZXdhYmxlIHNvdXJjZXMuIEludHVpdGl2ZWx5IGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IHRvIGZpbmQgYSBuZWdhdGl2ZSByZWxhdGlvbiB3aXRoIHRoZSBDTzIgZW1pc3Npb25zLg0KDQpgYGB7cn0NCg0KIyBFeHBvbmVudGlhbCByZXNwb25zZQ0KIyBtb2RlbDMgPC0gdGV4dENvbm5lY3Rpb24oIm1vZGVsew0KIyAgICMgbGlrZWxpaG9vZA0KIyAJZm9yIChpIGluIDE6Tikgew0KIyAJCSMgWVtpXSB+IGRub3JtKG11W2ldLCBpbnYucykNCiMgCQlZW2ldIH4gZGV4cChtdVtpXSkNCiMgCQlsb2cobXVbaV0pID0gYWxwaGEgKyBYW2ldICogYmV0YQ0KIyAJfQ0KIyANCiMgCSMgcHJpb3INCiMgCWFscGhhIH4gZG5vcm0oMCwgLjAwMSkNCiMgCWJldGEgfiBkbm9ybSgwLCAuMDAxKQ0KIyAJaW52LnMgfiBkZ2FtbWEoMC4wMDEsIDAuMDAxKQ0KIyB9IikNCg0KIyBOb3JtYWwgbW9kZWwNCm1vZGVsMyA8LSB0ZXh0Q29ubmVjdGlvbigibW9kZWx7DQogICMgbGlrZWxpaG9vZA0KCWZvciAoaSBpbiAxOk4pIHsNCgkJWVtpXSB+IGRub3JtKG11W2ldLCBpbnYudmFyKQ0KCQkjIFlbaV0gfiBkZXhwKG11W2ldKQ0KCQltdVtpXSA9IGFscGhhICsgWFtpXSAqIGJldGENCgl9DQoNCgkjIHByaW9yDQoJYWxwaGEgfiBkbm9ybSgwLCAuMDEpDQoJYmV0YSB+IGRub3JtKDAsIC4wMSkNCglpbnYudmFyIH4gZGdhbW1hKDAuMDAxLCAwLjAwMSkNCglzaWdtYTIgPC0gMS9pbnYudmFyDQp9IikNCg0KDQojIERhdGENClkgPSBDTzJfc3Vic2V0JGNvMnBlcmNhcA0KWCA9IENPMl9zdWJzZXQkTG93Y2FyYm9uX2VuZXJneQ0KIyBZID0gbG9nKENPMl9zdWJzZXQkY28ycGVyY2FwKSAgICAgICAgICMgbG9nDQojIFggPSBsb2coQ08yX3N1YnNldCRMb3djYXJib25fZW5lcmd5KQ0KDQpkYXRhTGlzdCA9IGxpc3QoWT1ZLCBYPVgsIE49bGVuZ3RoKFkpKQ0KDQoNCiMgSmFncyANCnNhbXBsZXMzIDwtIGphZ3MobW9kZWwuZmlsZSA9IG1vZGVsMywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YUxpc3QsDQogICAgICAgICAgICAgICAgICAgICAjIGluaXRzPWluaXRzLA0KICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50by5zYXZlPSBjKCJhbHBoYSIsICJiZXRhIiwgIm11IiwgInNpZ21hMiIpLA0KICAgICAgICAgICAgICAgICAgICAgbi5hZGFwdD0xMDAwLCBuLml0ZXI9MjAwMDAsIG4uY2hhaW5zID0gMiwgbi5idXJuaW4gPSAyMDAwLA0KICAgICAgICAgICAgICAgICAgICAgbi50aGluID0gMikNCmBgYA0KDQpgYGB7cn0NCiMgT3V0cHV0DQpzYW1wbGVzMw0KDQojIFRyYWNlIGFuZCBkZW5zaXR5DQpwbG90KHNhbXBsZXMzJHNhbXBsZXNbLGMoJ2FscGhhJyldLCBtYWluPSJwb3N0ZXJpb3IgYWxwaGEiKQ0KcGxvdChzYW1wbGVzMyRzYW1wbGVzWyxjKCdiZXRhJyldLCBtYWluPSJwb3N0ZXJpb3IgYmV0YSIpDQpwbG90KHNhbXBsZXMzJHNhbXBsZXNbLGMoJ3NpZ21hMicpXSwgbWFpbj0icG9zdGVyaW9yIHNpZ21hMiIpDQpgYGANCg0KYGBge3J9DQojIFBsb3R0aW5nIHRoZSBkYXRhIGJ5IGNvdW50cnkNCnBsb3QoWCwgWSwNCiAgICAgeGxhYiA9ICJMb3cgQ2FyYm9uIEVuZXJneSAlIiwgeWxhYiA9ICJDTzIgcGVyIGNhcGl0YSBbdG9uc10iLCANCiAgICAgbWFpbiA9ICJDTzIgcGVyIGNhcGl0YSB2cyBMb3cgY2FyYm9uIGVuZXJneSIsDQogICAgIHBjaCA9IDIwLA0KICAgICBjZXggPSAxLA0KICAgICBjb2wgPSAiYmxhY2siLA0KICAgICAjIHhheHQgPSAnbicsICAjIHN1cHByZXNzIGRlZmF1bHQgeC1heGlzDQogICAgICMgeWF4dCA9ICduJyAgIyBzdXBwcmVzcyBkZWZhdWx0IHgtYXhpcw0KICAgICApDQoNCiMgQWRkaW5nIGN1c3RvbSB4LWF4aXMgbGFiZWxzDQojIG5ld19sYWJlbHNfeCA8LSBjKDEwXjEsIDEwXjIsIDEwXjMsIDEwXjQsIDEwXjUpDQojIGF4aXMoMSwgYXQgPSBzZXFfYWxvbmcobmV3X2xhYmVsc194KSwgbGFiZWxzID0gbmV3X2xhYmVsc194KQ0KIyAjIA0KIyAjICMgQWRkaW5nIGN1c3RvbSB5LWF4aXMgbGFiZWxzDQojIG5ld19sYWJlbHNfeSA8LSBjKDEwXi0xLCAxMF4wLCAxMF4xLCAxMF4yLCAiMWUzIikNCiMgYXhpcygyLCBhdCA9IHNlcV9hbG9uZyhuZXdfbGFiZWxzX3kpIC0gMiwgbGFiZWxzID0gbmV3X2xhYmVsc195KQ0KDQoNCg0KDQojIFJlY292ZXJpbmcgYWxwaGEgYW5kIGJldGENCnNzID0gc3VtbWFyeShzYW1wbGVzMykNCiMgQWxwaGENCmFscGhhX21lYW4gPSBzc1siYWxwaGEiLCAibWVhbiJdDQphbHBoYV9xMSA9IHNzWyJhbHBoYSIsICIyLjUlIl0NCmFscGhhX3EyID0gc3NbImFscGhhIiwgIjk3LjUlIl0NCiMgQmV0YQ0KYmV0YV9tZWFuID0gc3NbImJldGEiLCAibWVhbiJdDQpiZXRhX3ExID0gc3NbImJldGEiLCAiMi41JSJdDQpiZXRhX3EyID0gc3NbImJldGEiLCAiOTcuNSUiXQ0KDQoNCg0KDQojIEV4cG9uZW50aWFsICAodXNlIHRob3NlIHBsb3Qgd2l0aCB0aGUgZXhwb25lbnRpYWwgbW9kZWwpDQojIFlfcHJlZCA9IGV4cChhbHBoYV9tZWFuICsgYmV0YV9tZWFuKlgpDQojIFlfcTEgPSBleHAoYWxwaGFfcTEgKyBiZXRhX3ExKlgpDQojIFlfcTIgPSBleHAoYWxwaGFfcTIgKyBiZXRhX3EyKlgpDQojIA0KIyANCiMgcG9pbnRzKFgsIDEvWV9wcmVkLCBjb2w9J3JlZCcpDQojIHBvaW50cyhYLCAxL1lfcTEsIGNvbD0nZ3JlZW4nKQ0KIyBwb2ludHMoWCwgMS9ZX3EyLCBjb2w9J2dyZWVuJykNCg0KDQoNCg0KIyBOb3JtYWwgcmVzcG9uc2UNCg0KIyBBZGQgYSBncmF5IGJhY2tncm91bmQNCnJlY3QocGFyKCJ1c3IiKVsxXSwgcGFyKCJ1c3IiKVszXSwgcGFyKCJ1c3IiKVsyXSwgcGFyKCJ1c3IiKVs0XSwgY29sID0gImdyYXk5MCIsIGJvcmRlciA9IE5BKQ0KcGFuZWwuZmlyc3QgPSBncmlkKGNvbCA9ICJ3aGl0ZSIsIGx0eSA9ICJkb3R0ZWQiKQ0KcG9pbnRzKFgsIFksIHBjaCA9IDIwLCBjZXggPSAxLCBjb2wgPSAiYmxhY2siKQ0KDQojIExpbmVzDQphYmxpbmUoYSA9IGFscGhhX21lYW4sIGIgPSBiZXRhX21lYW4sIGNvbCA9ICJyZWQiLCBsd2QgPSAzKQ0KYWJsaW5lKGEgPSBhbHBoYV9xMSwgYiA9IGJldGFfcTEsIGNvbCA9ICJyZWQiLCBsdHk9MiwgbHdkID0gMykNCmFibGluZShhID0gYWxwaGFfcTIsIGIgPSBiZXRhX3EyLCBjb2wgPSAicmVkIiwgbHR5PTIsIGx3ZCA9IDMpDQoNCiMgbGVnZW5kDQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQ9YygiMi41JSIsICI5Ny41JSIpLCBjb2w9YygicmVkIiwgInJlZCIpLCBsdHk9MywgbHdkID0gMywNCiAgICAgICBjZXg9MC44KQ0KYGBgDQoNClRoZSBtb2RlbCB3ZSBjaG9vc2UgZG9lc24ndCBmaXQgdG9vIHdlbGwgd2l0aCB0aGUgZGF0YSwgYnV0IGEgc21hbGwgbmVnYXRpdmUgdHJlbmQgaXMgcHJlc2VudCBhbmQgb3VyIGh5cG90aGVzaXMgYXJlIHZlcmlmaWVkLg0KDQpgYGB7cn0NCiMNCmBgYA0KDQpgYGB7cn0NCiMNCmBgYA0KDQpgYGB7cn0NCg0KYGBgDQoNCioqUHJvc3NpbWkgc3RlcDoqKg0K